检查Table1中的字段组合是不是存在于另一个Table2中(SQL)
Posted
技术标签:
【中文标题】检查Table1中的字段组合是不是存在于另一个Table2中(SQL)【英文标题】:Check if combination of fields in Table1 exists in another Table2 (SQL)检查Table1中的字段组合是否存在于另一个Table2中(SQL) 【发布时间】:2014-02-25 21:28:48 【问题描述】:我需要检查我的表 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)?
【问题讨论】:
您使用什么数据库系统?另外,请注意,您提供的 SELECT 实际上并未返回 A 中不存在于 B 中的元组,而是返回 A 中与 either 没有任何匹配项的元组表 2 中的 colX_table_1 和 colY_table_1。 【参考方案1】:您给出的查询分别评估每个字段:
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)
【讨论】:
谢谢。事实上,原来的查询是错误的。这给出了正确的结果。【参考方案2】:这在一定程度上取决于您的数据,但这在我的情况下有效:
select *
from table1
where colx||coly not in (select colx||coly from table2)
这个符号只是一个字符串连接:||
【讨论】:
以上是关于检查Table1中的字段组合是不是存在于另一个Table2中(SQL)的主要内容,如果未能解决你的问题,请参考以下文章
检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中