2009-08-17 2 views
3

私は次の問題があります。左側のすべての行がWhere句と一致しないまま左寄せ

私はアカウントテーブルとアカウントテーブルのエントリを持っています。 が ACCOUNT_NAME

entry_id 
account_idfk 
entry_date 
entry_amount 

をACCOUNT_ID今、私は与えられた期間内にすべてのアカウントのすべてのエントリを照会します。例えば。 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句に問題があることは知っています。他の期間のエントリのみが存在するすべてのアカウントを削除します。

しかし、私はどのように望ましい結果を得るために、クエリを修正再表示には考えている...

おかげで、 マーティン

答えて

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' 

何ここをクリックしてくださいjoinwhere条件の違いです。 joinは、その条件を満たす行のみを結合します。ただし、left joinを指定しても、左の表のすべての行が返されます。 where句を使用すると、の後に行がフィルタリングされます。この場合、日付が8/13/09(または池の向こうにある人の場合は13/8/09)のエントリに参加したいだけですが、すべてのアカウントを戻したいとします。したがって、条件はwhereではなく、join句に入る必要があります。

inner joinを使用すると、条件がjoinまたはwhere句であっても、結果は同じになるため、外部結合と混同されることがよくあります。しかし、これは今日あなたが実証したように、それが同等であるということを意味するものではありません!

+0

こんにちはEric!そのすばらしい返答をいただきありがとうございます。 私はJOINにも条件があることは知りませんでした。 –

関連する問題