如何在Oracle全外连接结果中添加from_table来源标识字段
在Oracle全外连接中添加来源表标识字段
Hey,我来帮你搞定这个需求!在Oracle里要给全外连接的结果加上from_table标识,核心就是利用条件判断来区分每行数据的来源——毕竟全外连接里,某一方的关联字段为NULL的时候,就说明这行只来自另一方嘛。
直接给你修改好的查询语句,结合你的需求调整后的版本:
SELECT a.a, b.b, CASE WHEN a.a IS NOT NULL AND b.b IS NOT NULL THEN 'A和B' WHEN a.a IS NOT NULL THEN '仅A' ELSE '仅B' END AS from_table FROM a FULL OUTER JOIN b ON a.a = b.b;
逻辑解释:
- 当
a.a和b.b都不为空时,说明这行是两张表的匹配行,标记为A和B - 只有
a.a不为空时,说明这行来自表A,B中没有对应匹配的数据,标记仅A - 剩下的情况就是只有
b.b不为空,说明这行仅来自表B,标记仅B
对应你给出的示例数据,执行后的结果会是这样:
a | b | from_table
-----+-----+-----------
1 | null | 仅A
2 | null | 仅A
3 | 3 | A和B
4 | 4 | A和B
null | 6 | 仅B
null | 5 | 仅B
如果你觉得CASE语句有点繁琐,也可以用Oracle专属的NVL2函数来简化写法,效果完全一致:
SELECT a.a, b.b, NVL2(a.a, NVL2(b.b, 'A和B', '仅A'), '仅B') AS from_table FROM a FULL OUTER JOIN b ON a.a = b.b;
小提醒:
如果你的表本身存在关联字段为NULL的合法数据(比如表A里有a字段为NULL的行),那建议改用两张表的主键来判断来源,比如假设A的主键是id_a,B的主键是id_b,把判断条件换成id_a IS NOT NULL和id_b IS NOT NULL,这样能避免误判原本就有NULL值的合法行。
内容的提问来源于stack exchange,提问作者user5783725
相关产品推荐
相关产品推荐

