查询以查找两个表和两列之间的一对多关系(排除任何一对一的关系)

时间:2012-09-30 23:02:48

标签: sql

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

例如, 我有表1。

FILENAME TYPE SEC

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

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

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

d----------------y----3
表2中的

我会有类似的东西,

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

我的数据库非常庞大,非常感谢任何帮助!

感谢。

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

type

根据数据库的不同,可能有更有效的查询方式。

答案 2 :(得分: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

组合