我需要检查表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)?
答案 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)
此表示法只是字符串连接:||