关联TableA与TableB后如何输出指定列结构及匹配状态的结果?
问题描述
我有两个数据表:
- TableA 包含
name、id、city三列,数据如下:
| name | id | city |
|---|---|---|
| xyz | 1 | ab |
| xyz2 | 2 | ab1 |
| xyz3 | 3 | ab2 |
- TableB 包含
name、id两列,数据如下:
| name | id |
|---|---|
| xyz3 | 3 |
| abc2 | 4 |
期望输出包含 name、id、city、match 四列的结果,其中 match 标记该行是否在两表中匹配,预期结果:
| name | id | city | match |
|---|---|---|---|
| xyz | 1 | ab | no |
| xyz2 | 2 | ab1 | no |
| xyz3 | 3 | ab2 | yes |
| abc2 | 4 | NULL | no |
我尝试执行以下SQL:
select * from TableA a full outer join TableB b on a.id= b.id
但结果出现重复的 name 和 id 列,不符合预期,寻求正确的SQL实现方法。
解决方案
问题出在 SELECT * 会同时取出两个表的 name 和 id 列,导致重复。需要手动指定输出列,并用 COALESCE 合并两个表的同名列,同时通过 CASE 语句生成 match 标记:
SELECT COALESCE(a.name, b.name) AS name, COALESCE(a.id, b.id) AS id, a.city, CASE WHEN a.id IS NOT NULL AND b.id IS NOT NULL THEN 'yes' ELSE 'no' END AS match FROM TableA a FULL OUTER JOIN TableB b ON a.id = b.id;
说明:
COALESCE(a.name, b.name):优先取TableA的name,如果TableA中该行为空(即仅存在于TableB的行),则取TableB的name;同理处理id列,避免重复列。CASE语句:当a.id和b.id都不为空时,说明两行匹配,标记为yes;否则标记为no。a.city:仅TableA有该列,不存在于TableB的行中该值为NULL,符合预期。
执行上述SQL后,即可得到期望的结果。
内容的提问来源于stack exchange,提问作者Keshav
相关产品推荐
相关产品推荐

