如何编写LEFT JOIN语句保留左表全量行并筛选右表指定条件?
如何编写满足LEFT JOIN且筛选关联表特定条件的SQL语句?
数据表结构与数据
Table1
| Id1 | Phrase |
|---|---|
| 1 | Hello |
| 2 | Bye |
| 3 | Thanks |
Table2
| Id2 | Color | Shape |
|---|---|---|
| 1 | Green | Square |
| 3 | Yellow | Circle |
| 3 | Blue | Square |
需求
执行LEFT JOIN关联两张表,保留Table1的全部行,同时仅匹配Table2中Shape='Square'的记录,预期返回结果:
1 Hello Green 2 Bye NULL 3 Thanks Blue
现有查询的问题
- Query 1:未对Table2的Shape做筛选,返回了所有关联记录,不符合要求:
SELECT Id1, Phrase, Color FROM Table1 LEFT JOIN Table2 ON Id2 = Id1 - Query 2:把
Shape='Square'放在WHERE子句中,会丢失Table1中无符合条件关联的行(比如Id1=2),因为LEFT JOIN后这些行的Shape字段为NULL,WHERE条件会直接排除它们:SELECT Id1, Phrase, Color FROM Table1 LEFT JOIN Table2 ON Id2 = Id1 WHERE Shape = 'Square'
正确的SQL语句
将筛选条件放到LEFT JOIN的ON子句中,而不是WHERE子句:
SELECT Id1, Phrase, Color FROM Table1 LEFT JOIN Table2 ON Id2 = Id1 AND Shape = 'Square'
原理说明
LEFT JOIN的ON子句既定义关联规则,也可以用来过滤要关联的Table2记录——这样只会匹配Table2中符合Shape='Square'的行,同时完整保留Table1的所有记录。对于Table1中找不到对应符合条件Table2记录的行,Table2的字段会显示为NULL,完全符合预期需求。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

