如何检查值是否存在于另一表?查询Table A不在Table B指定列的行
如何找出Table A中某值不在Table B指定列的所有行
别为SQL基础薄弱道歉呀,这类需求其实是SQL里很常见的场景,我给你整理了几种实用的实现方法,你可以根据自己的情况选择~
方法一:使用NOT EXISTS子查询(推荐,效率稳定)
这种方法的逻辑很直接:遍历Table A的每一行,检查Table B里是否存在匹配的值,不存在就保留该行。它的性能通常不错,尤其是当两个表的对应列有索引时。
SELECT * FROM TableA a WHERE NOT EXISTS ( -- 子查询:检查Table B中是否有和当前A行匹配的值 SELECT 1 FROM TableB b WHERE b.目标列名 = a.要检查的列名 );
替换代码里的目标列名为Table B的指定列,要检查的列名为Table A中你要验证的列即可。
方法二:使用NOT IN(写法简洁,但有注意点)
这个方法写法更短,但要特别注意:如果Table B的目标列存在NULL值,NOT IN会返回空结果,这是SQL的逻辑特性,一定要留意。
SELECT * FROM TableA WHERE 要检查的列名 NOT IN ( -- 先取出Table B目标列的所有值 SELECT 目标列名 FROM TableB );
方法三:使用LEFT JOIN + IS NULL(直观易懂)
通过左连接保留Table A的所有行,然后筛选出那些在Table B中没有匹配的行(对应B表的列会是NULL)。
SELECT a.* FROM TableA a -- 按指定列左连接两个表 LEFT JOIN TableB b ON a.要检查的列名 = b.目标列名 -- 筛选出B表中无匹配的行 WHERE b.目标列名 IS NULL;
小提示
- 如果你的表数据量较大,给Table A的
要检查的列名和Table B的目标列名添加索引,能显著提升查询速度。 - 用
NOT IN时,务必确认Table B的目标列没有NULL值,否则会得到不符合预期的结果。
内容的提问来源于stack exchange,提问作者Joe Brown
相关产品推荐
相关产品推荐

