我需要检查表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)