2

这个论坛的新手,SQL 的新手。我正在尝试清理一些数据并找出错误。我有两个表,它们都共享 FILENAME、TYPE、SEC 列,我想从两个表中提取 SEC 和 TYPE 之间存在一对多关系的任何记录,以及只有一个 SEC 和 TYPE 的任何记录to one 关系可以忽略并被认为是有效的。

例如,我在表 1 中。

FILENAME TYPE SEC

a----------------x----1

b----------------x----2

c----------------y----1

d----------------y----3

在 table2 我会有类似的东西,

FILENAME TYPE SEC

e----------------x----1 

f----------------x----2

g----------------z----1

h----------------y----3

所以我想要一个可以找到的查询

FILENAME TYPE SEC

a----------------x----1

c----------------y----1

e----------------x----1

g----------------z----1

我的数据库非常大,任何帮助将不胜感激!

谢谢。

4

3 回答 3

1
select t1.sec, t1.type, count(*) from table1 as t1 
join table2 as t2 on t1.sec = t2.sec and t1.type = t2.type
group by t1.sec, t1.type
having count(*) > 1

编辑:这不是你问的,这将显示哪些有多个记录,但它们会被分组。

于 2012-09-30T23:12:19.010 回答
0

您需要找到sec具有多个 1的值type。以下查询执行此操作,它应该适用于任何数据库:

select t.*
from ((select t1.*
       from t1
      ) union all
      (select t2.*
       from t2
      )
     ) t join
     (select sec
      from ((select t1.*
             from t1
            ) union all
            (select t2.*
             from t2
            )
           ) t
      group by sec
      having count(distinct type) > 1
     ) s
     on t.sec = s.sec

可能有更有效的查询方式,具体取决于数据库。

于 2012-09-30T23:13:05.273 回答
0
select 'table1' which, t.*
from (
    select sec, min(type) typea, max(type) typeb
    from table1
    group by sec
    having min(type) <> max(type)
) x
join table1 t on t.sec = x.sec
UNION ALL
select 'table2', t.*
from (
    select sec, min(type) typea, max(type) typeb
    from table1
    group by sec
    having min(type) <> max(type)
) x
join table2 t on t.sec = x.sec

第二个只是复制第一个,使用 UNION ALL 组合

于 2012-09-30T23:13:32.223 回答