左连接给出不正确的结果
Posted
技术标签:
【中文标题】左连接给出不正确的结果【英文标题】:Left-join gives incorrect result 【发布时间】:2018-01-03 09:20:22 【问题描述】:我有 2 个表 A 和 B。这 2 个表有 1 个共同点:A.A1 和 B.B1。表 A 有 800 行,表 B 有 500 行。显然,表 A 中的某些行在表 B 中没有任何匹配的行。 现在,我想通过发出以下查询来查看“A 中的哪些行与 B 中的行不匹配”:
select * from A
LEFT JOIN B on A.A1 = B.B1
where date(b.trt_date) = '2017-11-18' and a.tcs_type = 'SALES'
order by a.tcs_no asc
这个查询给出的结果与 INNER JOIN 相同。 为什么?
当我将此查询放入 VIEW 时,它会给出预期的结果
这应该很简单。我只是一头雾水。
我正在使用:mysql、navicat、sqlyog
【问题讨论】:
您在 where 子句中引用了表 B! date(b.trt_date) = xxx 将删除 B 中没有匹配行的所有行。您可能打算在 join 子句中包含该谓词。 ok .. 是的,我终于找到了答案。谢谢...你是对的 顺便提一下,date() 不能使用索引。如果你可以写成b.trt_date BETWEEN '2017-11-18 00:00:00' AND '2017-11-18 23:59:59'
,那么它可以使用索引。
找出左连接的作用。了解如何清晰简洁地表达它。将事物放在引号中并不能澄清。澄清澄清。
left join turns into inner join的可能重复
【参考方案1】:
您的查询:
select * from A
LEFT JOIN B on A.A1 = B.B1
where date(b.trt_date) = '2017-11-18' and a.tcs_type = 'SALES'
order by a.tcs_no asc
与INNER JOIN
类似,因为您设置了WHERE
条件:
date(b.trt_date) = '2017-11-18'
您以这种方式剪切了b.trt_date
为null
的所有行。
封装在LEFT JOIN
的ON
子句中的条件如何工作:
NULL
的行
如果主表和辅助表都可以 -> 显示包含所有信息的行
【讨论】:
【参考方案2】:SELECT * from A
LEFT JOIN B on A.A1 = B.B1
WHERE B.A1 IS NULL
类似的帖子在这里How to retrieve non-matching results in mysql
【讨论】:
以上是关于左连接给出不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章
Access 2007 - 左连接返回正确结果,内连接不返回任何结果