Oracle中LEFT JOIN关联含Null值列的查询问题
解决LEFT JOIN无法返回含NULL匹配行的问题
你这个问题是LEFT JOIN使用时的常见误区——当你把b.line_nr = 1放在WHERE子句里时,会直接过滤掉所有Table_b中没有匹配的行(也就是Table_a里那条col1、col2为NULL的记录)。原因很简单:LEFT JOIN后,左表(Table_a)中找不到匹配右表(Table_b)的行,右表的所有字段都会被填充为NULL,而WHERE b.line_nr = 1会把这些b.line_nr为NULL的行直接排除。
要解决这个问题,只需要把b.line_nr = 1这个条件移到JOIN的ON子句中,而不是WHERE子句:
SELECT a.Pos_id, a.col1, a.col2, a.value FROM table_a a LEFT JOIN table_b b ON a.pos_id = b.pos_id AND a.col1 = b.col1 AND a.col2 = b.col2 AND b.line_nr = 1;
为什么这样有效?
- LEFT JOIN的ON子句是用来指定匹配规则的:在进行JOIN操作时,只寻找Table_b中满足
line_nr = 1且与Table_a匹配的记录。 - 对于Table_a中无法匹配到符合条件的Table_b记录的行(比如那条col1、col2为NULL的记录),LEFT JOIN会保留这条行,同时将Table_b的字段填充为NULL,不会被过滤。
执行这条SQL后,你就能得到期望的结果:
| Pos_id | col1 | col2 | value |
|---|---|---|---|
| 12221 | null | null | Car |
| 12222 | 112 | 1111 | Bike |
内容的提问来源于stack exchange,提问作者Sangathamilan Ravichandran
相关产品推荐
相关产品推荐

