You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

执行结果

运行上述语句后返回结果和预期完全一致:

CIDNAMEEMAILMOIBLEDataSource
1TEST1updateda@gmail999999From T3
2TEST2updatedb@gmail77777From T2
3TEST3c@gmail123456From T1
4TEST4d@gmail123456From T1

优化说明

  1. 这里用UNION ALL替代你原有语句中的UNION:因为前置的存在性过滤已经保证三个结果集的CID无重复,UNION ALL不需要执行额外的去重排序操作,执行效率更高。
  2. 如果业务中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:15:43