为什么LEFT OUTER JOIN会减少左表中的行数?

时间:2016-01-18 16:35:56

标签: mysql join correlated-subquery

只想显示表A和LEFT JOIN表B中的所有数据以及coorelate子查询,但无法获取表A中的所有数据

SELECT a.id FROM tableA a 
LEFT JOIN tableB b1 ON a.id = b1.id
WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id)
tableA

id
======
1001
1002
1003
1004

tableB

id   date
=============
1001 20160101
1001 20160102
1003 20160102
1003 20160105

Expected Result

id   date
===============
1001 20160102
1002 NULL
1003 20160105
1004 NULL

Engine Return

id   date
=============
1001 20160102
1003 20160105

3 个答案:

答案 0 :(得分:3)

我要做的是在subselect上的左连接,它只包含每个id的最大日期,如下所示:

SELECT a.id, b.maxdate FROM tableA a 
LEFT JOIN (SELECT id, MAX(date) AS 'maxdate' FROM tableB2 GROUP BY id) b ON a.id = b.id

这也应该更快,因为连接的select只会执行一次,而where子句中的select将针对每一行执行。

答案 1 :(得分:0)

将您的查询更新为:

SELECT a.id, b1.date FROM tableA a 
LEFT outer JOIN tableB b1 ON a.id = b1.id
WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id) or date is null

答案 2 :(得分:0)

where子句适用于已连接的数据集,因此where条件会从结果集中删除那些与条件不匹配的记录。

我会将子查询移到from子句:

SELECT a.id FROM tableA a 
LEFT JOIN (SELECT MAX(date) as mdate, id FROM tableB GROUP BY id) b1 ON a.id = b1.id