【问题标题】:Why LEFT OUTER JOIN reduces rows from left table?为什么 LEFT OUTER JOIN 会减少左表中的行数?
【发布时间】:2016-04-23 22:00:22
【问题描述】:

只想使用 coorelate 子查询显示表 A 和 LEFT JOIN 表 B 中的所有数据,但无法获取表 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)
表A ID ====== 1001 1002 1003 1004 表B 身份证日期 ============== 1001 20160101 1001 20160102 1003 20160102 1003 20160105 预期结果 身份证日期 ================ 1001 20160102 1002 空 1003 20160105 1004 空 发动机返回 身份证日期 ============== 1001 20160102 1003 20160105

【问题讨论】:

    标签: mysql join correlated-subquery


    【解决方案1】:

    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
    

    【讨论】:

    • 我认为你的子选择将返回整个表的每一行的 MAX(date),如果它没有按 id 分组,否则它与我的解决方案相同 ;-)
    • 谢谢,错过了。
    • 它仍然不正确,但看到 Fuzzzzel 已经解决了,一个 DELETE 可能就足够了。
    • 感谢您的解释。你清楚了我的概念,谢谢!
    【解决方案2】:

    我要做的是对子选择进行左连接,它只包含每个 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
    

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

    【讨论】:

      【解决方案3】:

      将您的查询更新为:

      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
      

      【讨论】:

      • 将“WHERE”更改为“AND”,并丢失“或日期为空”位 - 或者只使用上面更好的答案。
      猜你喜欢
      • 2023-02-10
      • 2018-08-21
      • 2014-05-08
      • 1970-01-01
      • 2019-03-10
      • 2017-10-06
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多