我有以下问题:
我有一个帐户表和帐户表条目。 帐户ID ACCOUNT_NAME
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子句中 - 我删除了所有仅存在其他时间段条目的帐户。
但我不知道如何重新生成查询以获得所需的结果......
谢谢, 马丁
答案 0 :(得分:5)
将该条件移至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'
您在此处看到的是join
和where
条件之间的区别。 join
只会加入符合该条件的行。但是,使用left join
,您仍会返回左表中的所有行。使用where
子句,您将在连接后过滤行。在这种情况下,您只想加入日期为8/13/09的条目(或9/8/09,对于整个池塘的人),但您想要返回所有帐户。因此,条件需要进入join
子句,而不是where
。
这常常与任何外连接混淆,因为对于inner join
,无论条件是否在join
或where
子句中,结果都是相同的。但是,这并不意味着它们是等价的,正如你今天所证明的那样!