如何通过SQL部分连接实现含A/B/XX标签的目标表?
解决SQL连接标签生成问题
你的问题出在连接条件同时限定了ID和年份匹配,这样ID匹配但年份不同的T2记录无法关联到T1的任何行,自然无法生成'A'标签。你需要调整连接逻辑,先仅按ID关联,再通过case语句分层判断标签。
修改方案一(连接方式)
select T2.ID, T2.year, case when T1.year = T2.year then 'B' when T1.ID is not null then 'A' else 'XX' end as label from T1 right join T2 on T1.ID = T2.ID
逻辑说明:
- 右连接仅按
T1.ID = T2.ID关联,确保所有T2的记录都被保留,同时关联到T1中同ID的所有行 - 第一层判断:若T1与T2年份匹配,标记为'B'
- 第二层判断:若T1的ID存在(说明ID匹配但年份不匹配),标记为'A'
- 最后一层:T1.ID为null时,说明无匹配ID,标记为'XX'
修改方案二(子查询方式,避免重复行)
如果T1中同ID存在多条记录,连接方式可能产生重复结果,用exists子查询更稳妥:
select T2.ID, T2.year, case when exists (select 1 from T1 where T1.ID = T2.ID and T1.year = T2.year) then 'B' when exists (select 1 from T1 where T1.ID = T2.ID) then 'A' else 'XX' end as label from T2
逻辑说明:
- 直接基于T2表查询,通过两次子查询分别判断:
- 是否存在同ID且同年份的记录,是则标记'B'
- 若不存在同年份但存在同ID的记录,标记'A'
- 无匹配ID则标记'XX'
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

