2014-02-25 49 views
2

我需要检查值在我的表A中的组合是否在不同的表中的列指定相应的设置存在,B.检查表1中字段的组合在另一表2(SQL)存在

所以到目前为止,我这样做,这似乎不是很优雅或有效率:

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)?

+0

你用什么数据库系统?另外,请注意,您提供的SELECT实际上并不返回B中不存在的元组,而是返回A中与* table * 2中的* colX_table_1和colY_table_1没有任何匹配的元组。 – Razvan

回答

12

你给我的查询将分别评估每一个领域:

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) 

这不仅是unelegant,如你要求,这是错误的,因为它不强制组合。例如,请考虑以下表格:

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

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

根据您的文章,您正在寻找一个查询将返回该行中table1的,因为这样的组合不存在表2。但是,在给定的查询中,where子句的每个部分评估为false,并且该行不返回。

相反,为了检查相结合,而不是各自单独列,你可以使用一个exists条件:

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

谢谢。事实上,原始查询是错误的。这给出了正确的结果。 –

相关问题