sql - Left Join 从左边开始不匹配 Where 子句的所有行

标签 sql mysql

我有以下问题:

我有一个帐户表和一个帐户表条目。 帐户ID 帐户名

entry_id
account_idfk
entry_date
entry_amount

现在我想查询给定时间段内所有帐户的所有条目。例如。我想要所有帐户从 2008 年 10 月到 2009 年 10 月的所有条目。如果此帐户根本没有条目,或者此帐户只有其他时间段的条目,我也希望该帐户被退回。

我当前的查询有效,如果根本没有条目,或者这个帐户的这个时间段有条目。但是 - 它忽略了只有其他时间段的条目的帐户。

SELECT * FROM Account a
         LEFT JOIN Entries e ON e.account_idfk = a.account_id
         WHERE e.entry_date BETWEEN '2009-08-13' AND '2009-08-13'
               OR e.entry_date IS NULL

我知道问题出在 where 子句中 - 我删除了所有仅存在其他时间段条目的帐户。

但我不知道如何重述查询以获得所需的结果...

谢谢, 马丁

最佳答案

将该条件移动到join:

SELECT
    * 
FROM 
    Account a
    LEFT JOIN Entries e ON 
        e.account_idfk = a.account_id
        AND e.entry_date BETWEEN '2009-08-13' AND '2009-08-13'

您在这里看到的是 joinwhere 条件之间的区别。 join 只会连接满足该条件的行。但是,对于 left join,您仍然会返回左表中的所有行。使用 where 子句,您可以在连接 之后过滤行。在这种情况下,您只想加入日期为 8/13/09(或 13/8/09,对于整个池塘)的条目,但您想要返回所有帐户。因此,条件需要进入 join 子句,而不是 where

这经常与任何外连接混淆,因为对于 inner join,无论条件是在 join 还是 中,结果都是相同的where 子句。然而,这并不意味着它们是等价的,正如您今天所展示的那样!

关于sql - Left Join 从左边开始不匹配 Where 子句的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1287613/

相关文章:

php - MySQL查询优化

mysql - 如何得到除法的商和余数

Mysql将动态内容传递给存储过程中的sql查询

SQL Server 选择前 10-20 个结果?

mysql - 获取特定条目以防重复条目

php - 在 MySQL 的 BLOB 列中搜索值

C# 和 MySql 更改列变量

sql - 在 h2 数据库上创建 View

php - 人们注册时如何防止重复的用户名?

php - SQL 查询的数组问题