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

gen*_* b. 3 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) 
Run Code Online (Sandbox Code Playgroud)

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

Mur*_*nik 16

您给出的查询分别评估每个字段:

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) 
Run Code Online (Sandbox Code Playgroud)

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

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

table2:
------
colX colY
1    2
2    1
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT *
FROM   table1
WHERE  NOT EXISTS (SELECT *
                   FROM   table2
                   WHERE  table1.colx = table2.colx AND
                          table1.coly = table2.coly)
Run Code Online (Sandbox Code Playgroud)