mysql on后加and,mysql-左联接on子句中的“ AND 1” /“ AND 0”做什么

这是相关问题的摘要

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

根据显示的是“和1”还是“和0”,我看到了不同的结果.如果需要,我可以提供更多代码段,但我希望它有一个简单的通用答案.

编辑:答案极大地帮助了,但是我的sql的实际问题是该group by返回了我不想要的行. (已删除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为null,它将始终评估为TRUE.在MySQL中,TRUE或NULL的计算结果为TRUE,因此这可能会允许某些记录进入您的结果集中.

标签:sql,mysql

来源: https://codeday.me/bug/20191027/1943917.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值