表结构如下
表Table_A:
id | name |
---|---|
1 | 张三 |
2 | 赵四 |
3 | 王五 |
表Table_B:
id | type |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
想查询出A表中所有的结果并关联B中特定字段,如下表
id | name | type |
---|---|---|
1 | 张三 | 1 |
2 | 赵四 | null |
3 | 王五 | null |
错误SQL:
SELECT A.* ,B.type FROM Table_A A LEFT JOIN Table_B B ON A.id=B.id WHERE B.type=1
结果:
id | name | type |
---|---|---|
1 | 张三 | 1 |
正确SQL:
SELECT A.* ,B.type FROM Table_A A LEFT JOIN Table_B B ON A.id=B.id AND B.type=1
结果:
id | name | type |
---|---|---|
1 | 张三 | 1 |
2 | 赵四 | null |
3 | 王五 | null |
原因:
sql1是在SELECT A.* ,B.type FROM Table_A A LEFT JOIN Table_B B ON A.id=B.id
查询后执行WHERE B.type=1,所以过滤掉了type不为1的数据
sql2可以理解为是在A关联B时对比B进行了筛选