【问题标题】:SQL Left Join On Date FilterSQL 左连接日期过滤器
【发布时间】:2021-12-25 03:54:21
【问题描述】:

我试图弄清楚为什么这两个 SQL sn-ps 返回不同的结果。

SQL A

SELECT date, id 
FROM Table A 
LEFT JOIN Table B ON A.id = B.id 
                  AND a.date = date_add('day', -1, CURRENT_DATE);

SQL B

SELECT date, id 
FROM Table A 
LEFT JOIN Table B ON A.id = B.id 
WHERE a.date = date_add('day', -1, CURRENT_DATE);

SQL A 返回表 A 中的所有日期,而 SQL B 只返回昨天。

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center
  • @marc_s 不确定“SQL”是指“查询”而不是“DBMS”。 (所以我在编辑时保持不变。)此外,“(代码)sn-p”现在是一个 SO 技术术语,所以我建议只使用它而不是指代码片段。

标签: sql date left-join


【解决方案1】:

发生这种情况是因为在第二个查询中您正在过滤 WHERE 子句中的结果。

SQL A :因为它是left join,所以您将从表 A 中获得所有结果,并且只要找不到匹配项,您就会看到表 B 的 NULL 值。 p>

SQL B :你将得到与 SQL A 相同的所有结果,但是你有 WHERE 条件 WHERE a.date = date_add('day',-1,CURRENT_DATE); 只保留昨天的记录。

您的结果会根据您将 DATE 条件放在哪里而发生变化。 SQL A 在JOIN 中,SQL B 在WHERE 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 2020-01-04
    • 2013-04-17
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多