左连接给出不正确的结果

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_datenull 的所有行。

封装在LEFT JOINON 子句中的条件如何工作:

如果主表不满足条件 -> 不显示行 如果主表条件OK,但副表不符合-> 显示副表所有字段为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 - 左连接返回正确结果,内连接不返回任何结果

与子查询相比,为啥左外连接查询给出不同的结果?

在mysql查询中结合左连接和右连接

SQL——左连接(Left join)右连接(Right join)内连接(Inner join)

使用左连接和不同的总和不正确的值

mysql左连接没有数据还会查出来吗