无关联两表profile1与profile2异同行查询及SQL语句验证
验证跨表profile组合查询的SQL正确性
咱们来逐个排查你写的这三个SQL语句的问题,帮你修正后拿到准确的三类数据结果:
1. 同时存在于table1和table2的profile1+profile2组合
你写的原语句有两个关键问题:
- 子查询错误地用了
profcode和connecting_profcode作为匹配条件,但你明确要求只关注profile1和profile2列,完全偏离了需求; - 子查询里的
SELECT DISTINCT是多余的——EXISTS只关心子查询是否能找到匹配记录,不管返回的是什么列或者有没有重复,写SELECT 1反而效率更高。
正确写法(两种可选)
-- 方式1:用EXISTS判断存在性 SELECT DISTINCT T1.profile1, T1.profile2 FROM table1 T1 WHERE EXISTS ( SELECT 1 FROM table2 T2 WHERE T2.profile1 = T1.profile1 AND T2.profile2 = T1.profile2 ); -- 方式2:用INNER JOIN关联两表 SELECT DISTINCT T1.profile1, T1.profile2 FROM table1 T1 INNER JOIN table2 T2 ON T1.profile1 = T2.profile1 AND T1.profile2 = T2.profile2;
2. 仅存在于table1的profile1+profile2组合
原语句犯了一个核心逻辑错误:你要找仅在table1存在的组合,却从table2中查询,结果会完全相反(拿到的是仅在table2存在的组合);另外子查询里还重复写了两次DISTINCT,属于语法冗余错误。
正确写法(两种可选)
-- 方式1:用NOT EXISTS判断不存在性 SELECT DISTINCT T1.profile1, T1.profile2 FROM table1 T1 WHERE NOT EXISTS ( SELECT 1 FROM table2 T2 WHERE T2.profile1 = T1.profile1 AND T2.profile2 = T1.profile2 ); -- 方式2:用LEFT JOIN+IS NULL判断无匹配 SELECT DISTINCT T1.profile1, T1.profile2 FROM table1 T1 LEFT JOIN table2 T2 ON T1.profile1 = T2.profile1 AND T1.profile2 = T2.profile2 WHERE T2.profile1 IS NULL;
3. 仅存在于table2的profile1+profile2组合
原语句同样搞反了查询对象:你要找仅在table2存在的组合,却从table1中查询,结果会拿到仅在table1存在的组合,完全不符合需求。
正确写法(两种可选)
-- 方式1:用NOT EXISTS判断不存在性 SELECT DISTINCT T2.profile1, T2.profile2 FROM table2 T2 WHERE NOT EXISTS ( SELECT 1 FROM table1 T1 WHERE T1.profile1 = T2.profile1 AND T1.profile2 = T2.profile2 ); -- 方式2:用LEFT JOIN+IS NULL判断无匹配 SELECT DISTINCT T2.profile1, T2.profile2 FROM table2 T2 LEFT JOIN table1 T1 ON T2.profile1 = T1.profile1 AND T2.profile2 = T1.profile2 WHERE T1.profile1 IS NULL;
内容的提问来源于stack exchange,提问作者derrickrozay
相关产品推荐
相关产品推荐

