SQL Server按优先级过滤:同id存在Source B时排除Source A
正确SQL实现方案
你的原SQL逻辑错误,它会只保留存在B的id对应的A记录,这和需求完全相反,所以结果不符合预期。以下是几种符合需求的实现方式:
方法1:窗口函数(推荐,支持多Source类型扩展)
通过给每个id下的记录按优先级排序(B优先于A),然后取每个id的第一条记录:
SELECT id, Source FROM ( SELECT id, Source, -- 给B标记为1,A标记为2,按id分组排序后取第一条 ROW_NUMBER() OVER (PARTITION BY id ORDER BY CASE WHEN Source = 'B' THEN 1 ELSE 2 END) AS rn FROM t ) AS sub_query WHERE rn = 1
方法2:NOT EXISTS 逻辑筛选
直接按需求拆分条件:要么是B记录,要么是A记录且该id不存在B记录:
SELECT id, Source FROM t a WHERE Source = 'B' OR (Source = 'A' AND NOT EXISTS (SELECT 1 FROM t b WHERE b.id = a.id AND b.Source = 'B'))
方法3:GROUP BY 聚合(仅适用于只有A、B两种Source的场景)
利用B的ASCII码大于A的特性,用MAX函数直接取每个id的最高优先级Source:
SELECT id, MAX(Source) AS Source FROM t GROUP BY id
内容的提问来源于stack exchange,提问作者Marieta
相关产品推荐
相关产品推荐

