检查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)的主要内容,如果未能解决你的问题,请参考以下文章

检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中

检查所有ID是不是都存在于另一个数据集中[重复]

使用 lodash 检查数组是不是存在于另一个数组中

如何使用 linq 检测一个集合字段是不是存在于另一个列表中?

检查日期是不是已存在于另一个时间段中

检查 div 内容是不是已经存在于另一个 div 中?