这里是相关问题的片段
LEFT join tbl_ExpenseReportLineItem erli ON erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID and 1
根据它是说“和 1”还是“和 0”,我会看到不同的结果。如果需要,我可以提供更多片段,但我希望这有一个简单的通用答案。
编辑:答案帮助很大,但我的 sql 的实际问题是分组依据返回了我不想要的行。 (由于工作相关删除了 sql)。
最佳答案
1
和 0
在 MySQL 中与 TRUE
和 FALSE
同义。因此以下条件是相同的:
erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID AND 1
erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID AND TRUE
erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID
并且下面的条件也是相同的:
erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID AND 0
erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID AND FALSE
FALSE
当您在 LEFT JOIN
中使用 1
时,您将加入条件
erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID
并且当您使用 0
时,您将无法从第二个表中获得匹配的记录。具体来说,tbl_ExpenseReportHeader
表中的每条记录都会出现,但是 tbl_ExpenseReportLineItem
表中的列都将显示为 NULL
,因为连接条件是FALSE
每条记录。
更新:
您通过连接条件取回记录的原因
ON erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID AND 0
ON erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID AND FALSE
ON FALSE
是因为您的 WHERE
子句中有一个条件,即使 erli.*
将为 NULL,该条件的计算结果为
对于每条记录:TRUE
WHERE ... erli.StatusExport != 'EXPF' OR erli.ExportDate >= '2315-11-11 00:00:00'
OR erli.ExportDate = '2900-01-01 00:00:00' OR erli.ExportDate is null
这里的关键条件是 erli.ExportDate is null
,它将始终评估为 TRUE
。在 MySQL 中,TRUE OR NULL
的计算结果为 TRUE
,因此这可能会允许某些记录进入您的结果集。
关于mysql - 'AND 1'/'AND 0' 在左连接子句中做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35308089/