检查Table1中的字段组合是否存在于另一个Table2中(SQL)

时间:2014-02-25 21:28:49

标签: sql select

我需要检查表A中值的组合是否存在于另一个表B中指定的相应列集中。

到目前为止,我正在这样做,这似乎并不优雅或高效:

select * from table1 where 
colX_table_1 NOT IN (select colX_table_2 from table2) 
and 
colY_table_1 NOT IN (select colY_table_2 from table2) 

是否有更好/更快的方式进行此组合检查(colX_table_1,colY_table_1) - > (colX_table_2,colY_table_2)?

2 个答案:

答案 0 :(得分:14)

您提供的查询将分别评估每个字段:

select * from table1 where 
colX_table_1 NOT IN (select colX_table_2 from table2) 
and 
colY_table_1 NOT IN (select colY_table_2 from table2) 

这不仅仅是不优雅,正如你声称的那样,这是错误的,因为它没有强制执行组合。例如,请考虑以下表格:

table1:
------
colX colY
1    1

table2:
------
colX colY
1    2
2    1

根据您的帖子,您正在查找将返回table1中的行的查询,因为table2中不存在这样的组合。但是,在给定查询中,where子句的每个部分都计算为false,并且不返回该行。

相反,为了检查组合而不是单独检查每个列,您可以使用exists条件:

SELECT *
FROM   table1
WHERE  NOT EXISTS (SELECT *
                   FROM   table2
                   WHERE  table1.colx = table2.colx AND
                          table1.coly = table2.coly)

答案 1 :(得分:0)

这取决于您的数据,但这在我的情况下有效:

select *
from table1 
where colx||coly not in (select colx||coly from table2)

此表示法只是字符串连接:||