MSSQL三表按优先级联合查询 排除其他表已存在记录
MSSQL 多表按优先级取数实现方案
核心逻辑
三张表取数优先级为 T3 > T2 > T1,按CID维度去重,高优先级表已存在的CID不再从低优先级表读取:
- 第一部分:读取T3全部记录,优先级最高
- 第二部分:读取T2中CID未在T3出现的记录
- 第三部分:读取T1中CID未在T2、T3出现的记录
可直接运行的代码
基于你原有写法扩展,补充T1的过滤逻辑即可,额外增加DataSource字段标记数据来源,和预期输出格式对齐:
SELECT *, 'From T3' AS DataSource FROM T3 UNION ALL SELECT *, 'From T2' AS DataSource FROM T2 WHERE CID NOT IN (SELECT CID FROM T3) UNION ALL SELECT *, 'From T1' AS DataSource FROM T1 WHERE CID NOT IN (SELECT CID FROM T2) AND CID NOT IN (SELECT CID FROM T3)
执行结果
运行上述语句后返回结果和预期完全一致:
| CID | NAME | MOIBLE | DataSource | |
|---|---|---|---|---|
| 1 | TEST1 | updateda@gmail | 999999 | From T3 |
| 2 | TEST2 | updatedb@gmail | 77777 | From T2 |
| 3 | TEST3 | c@gmail | 123456 | From T1 |
| 4 | TEST4 | d@gmail | 123456 | From T1 |
优化说明
- 这里用
UNION ALL替代你原有语句中的UNION:因为前置的存在性过滤已经保证三个结果集的CID无重复,UNION ALL不需要执行额外的去重排序操作,执行效率更高。 - 如果业务中CID字段可能存在NULL值,
NOT IN写法会出现匹配异常,推荐替换为NOT EXISTS的稳妥写法:
SELECT *, 'From T3' AS DataSource FROM T3 UNION ALL SELECT *, 'From T2' AS DataSource FROM T2 WHERE NOT EXISTS (SELECT 1 FROM T3 WHERE T3.CID = T2.CID) UNION ALL SELECT *, 'From T1' AS DataSource FROM T1 WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE T2.CID = T1.CID) AND NOT EXISTS (SELECT 1 FROM T3 WHERE T3.CID = T1.CID)
内容的提问来源于stack exchange,提问作者Rio
相关产品推荐
相关产品推荐

