oracle 在 left join 时两表关联的字段为 null 时生效问题
问题形容
TESTA
subject | score |
---|---|
语文 | 90 |
数学 | 30 |
英语 | 9 |
100 |
TESTB
subject | score |
---|---|
语文 | 3 |
数学 | 79 |
英语 | 99 |
120 |
如果用 left join 会失落掉 TESTB 的空值对应的 120 这个值
SELECT a.*, b.*
FROM TESTA a
LEFT JOIN TESTB b ON a.subject = b.SUBJECT;
SUBJECT | SCORE | SUBJECT | SCORE |
---|---|---|---|
语文 | 90 | 语文 | 3 |
数学 | 30 | 数学 | 79 |
英语 | 9 | 英语 | 99 |
100 |
解决方案
在 left join 前要将空数据赋值,
with a as (SELECT nvl(subject, '-')subject, score FROM TESTA ),
b as (SELECT nvl(subject, '-')subject, score FROM TESTB )
SELECT a.*, b.*
FROM a
LEFT JOIN b ON a.subject = b.SUBJECT;
SUBJECT | SCORE | SUBJECT | SCORE |
---|---|---|---|
语文 | 90 | 语文 | 3 |
数学 | 30 | 数学 | 79 |
英语 | 9 | 英语 | 99 |
– | 100 | – | 120 |