SQL:对比表列子集、筛选特定行并获取单表唯一记录
SQL语法修正与需求实现
表结构信息
table_1
Name Address Height Weight X. y z. p G. H. I J Q W. E. R
table_2
Name Income Tax X. y z A B C
需求说明
要从table_1里找出只在table_1存在、table_2不存在的记录,但仅处理table_1中Height不等于I和E的行。
原查询的问题
原SQL报syntax error at or near "WHERE",问题出在:
- 连续写了两个
WHERE子句,不符合SQL语法规范 NOT LIKE ANY的数组拼接写法错误,而且这里Height是精确匹配场景,不需要模糊查询
修正后的SQL代码
1. 返回目标记录的查询
SELECT * FROM table_1 WHERE Height NOT IN ('I', 'E') AND NOT EXISTS ( SELECT 1 FROM table_2 WHERE table_2."Income" = 'y' AND UPPER(table_2."Name") LIKE CONCAT('%', UPPER(table_1."Name"), '%') )
执行结果:
Name Address Height Weight X. y z. p
2. 统计符合条件的记录数
SELECT COUNT(DISTINCT "Name") FROM table_1 WHERE Height NOT IN ('I', 'E') AND NOT EXISTS ( SELECT 1 FROM table_2 WHERE table_2."Income" = 'y' AND UPPER(table_2."Name") LIKE CONCAT('%', UPPER(table_1."Name"), '%') )
执行结果为1。
核心修正点
- 把两个
WHERE合并成一个,用AND连接多条件 - 用
NOT IN ('I', 'E')替代错误的模糊匹配写法,更贴合精确排除Height为I、E行的需求 - 子查询改用
SELECT 1,比选具体字段更高效,逻辑不受影响
内容的提问来源于stack exchange,提问作者winterlyrock
相关产品推荐
相关产品推荐

