为什么 LEFT OUTER JOIN 从左边减少行 table?
Why LEFT OUTER JOIN reduces rows from left table?
只是想显示 table A 和 LEFT JOIN table B 中的所有数据,但无法获取 table 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
将您的查询更新为:
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
我要做的是在子 select 上进行左连接,它只包含每个 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 将对每一行执行。
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
只是想显示 table A 和 LEFT JOIN table B 中的所有数据,但无法获取 table 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
将您的查询更新为:
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
我要做的是在子 select 上进行左连接,它只包含每个 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 将对每一行执行。
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