mysql - 'AND 1'/'AND 0' 在左连接子句中做什么

标签 mysql sql

这里是相关问题的片段

LEFT join tbl_ExpenseReportLineItem erli ON erh.ExpenseReportHeaderID = erli.ExpenseReportHeaderID and 1

根据它是说“和 1”还是“和 0”,我会看到不同的结果。如果需要,我可以提供更多片段,但我希望这有一个简单的通用答案。

编辑:答案帮助很大,但我的 sql 的实际问题是分组依据返回了我不想要的行。 (由于工作相关删除了 sql)。

最佳答案

10 在 MySQL 中与 TRUEFALSE 同义。因此以下条件是相同的:

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/

相关文章:

sql - 在带有 UNION 子句的 postgres 中使用 ORDER BY 的问题

php - MYSQL 类似但不等于

php - 使用 PHP 运行 .sql 文件

php - 更新链接未显示,而命令错误?

php - 在 PHP 中运行 MySQL *.sql 文件

sql - 如何选择每个类别中价格最高的产品?

php - 一次将 mysql 转换为 pdo 一个脚本

php - MySql 查询双 WHERE 子句

mysql - 更改 Knex rawquery 的输出

mysql - 统计 MySQL 的数据库结果