如何编写SQL查询获取表A全量值与表B未匹配值组合结果?
解决方法
首先,我们需要生成所有A1与B1的可能组合,再排除掉那些在表A中已经匹配(即A2对应B.Id)的组合。这里用NOT EXISTS比NOT IN更可靠,因为NOT IN在遇到NULL值时会出现预期外的结果(比如你表A中A1=7对应的A2是NULL,用NOT IN会导致没有返回值)。
最终的SQL语句如下:
SELECT DISTINCT a.A1 AS R1, b.B1 AS R2 FROM A a CROSS JOIN B b WHERE NOT EXISTS ( SELECT 1 FROM A a_sub WHERE a_sub.A1 = a.A1 AND a_sub.A2 = b.Id ) ORDER BY R1, R2;
分步解释:
CROSS JOIN:将表A中的每个A1值与表B的所有记录进行组合,得到所有可能的(R1, R2)候选对。NOT EXISTS子查询:检查当前(A1, B.Id)组合是否在表A中存在匹配的(A1, A2)记录——如果不存在,就保留这个组合。这完美处理了A2为NULL的情况(因为NULL与任何值比较都不成立,所以所有B记录都会被保留)。DISTINCT:由于表A中可能存在重复的A1值(比如A1=5出现了两次),交叉连接后会产生重复的结果行,用DISTINCT去重。ORDER BY:让输出结果与你期望的顺序一致。
验证结果:
- 对于A1=5:排除B.Id=2和3的记录,得到
5 | 1、5 | 9 - 对于A1=6:排除B.Id=9的记录,得到
6 | 1、6 | 2、6 | 3 - 对于A1=7:因为A2是
NULL,没有匹配的B.Id,所以保留所有B记录,得到7 | 1、7 | 2、7 | 3、7 | 9
完全符合你想要的输出结果。
内容的提问来源于stack exchange,提问作者katonacs
相关产品推荐
相关产品推荐

