Snowflake SQL:修复两表不匹配行查询返回空结果的问题
修复查询:找出两表中无匹配的行
你写的查询有两个致命问题:
- 两次子查询都查的是
TABLE_1,根本没用到TABLE_2,等于在同一张表的数据里找差异,自然不会有结果 - 用了
UNION(会自动去重),最后having count(*) > 1的逻辑完全反了——你要找的是只在其中一张表出现的行,这类行在合并后的结果里只会出现1次,而不是大于1次
下面是两种正确的写法:
方法1:用EXCEPT + UNION ALL
EXCEPT可以找出在第一个表存在但第二个表不存在的行,反过来再执行一次,用UNION ALL合并两边的差异结果:
-- 找出TABLE_1有但TABLE_2没有的行 SELECT employee_id, work_tenure FROM TABLE_1 EXCEPT SELECT employee_id, work_tenure FROM TABLE_2 UNION ALL -- 找出TABLE_2有但TABLE_1没有的行 SELECT employee_id, work_tenure FROM TABLE_2 EXCEPT SELECT employee_id, work_tenure FROM TABLE_1
方法2:用LEFT JOIN筛选无匹配行
通过左连接后判断对方表的字段是否为NULL,来找出无匹配的行:
-- TABLE_1中在TABLE_2无匹配的行 SELECT t1.employee_id, t1.work_tenure FROM TABLE_1 t1 LEFT JOIN TABLE_2 t2 ON t1.employee_id = t2.employee_id AND t1.work_tenure = t2.work_tenure WHERE t2.employee_id IS NULL UNION ALL -- TABLE_2中在TABLE_1无匹配的行 SELECT t2.employee_id, t2.work_tenure FROM TABLE_2 t2 LEFT JOIN TABLE_1 t1 ON t2.employee_id = t1.employee_id AND t2.work_tenure = t1.work_tenure WHERE t1.employee_id IS NULL
如果你的表存在重复行,需要先去重的话,可以在每个子查询里加上DISTINCT,比如SELECT DISTINCT employee_id, work_tenure FROM TABLE_1。
内容的提问来源于stack exchange,提问作者punsoca
相关产品推荐
相关产品推荐

