2013-02-25 22 views
46

我有2個表,我想篩選1個表之前兩個表連接在一起。應用左連接之前的篩選表

客戶表:

╔══════════╦═══════╗ 
    ║ Customer ║ State ║ 
    ╠══════════╬═══════╣ 
    ║ A  ║ S  ║ 
    ║ B  ║ V  ║ 
    ║ C  ║ L  ║ 
    ╚══════════╩═══════╝ 

項目表:

╔══════════╦═══════╦══════════╗ 
    ║ Customer ║ Entry ║ Category ║ 
    ╠══════════╬═══════╬══════════╣ 
    ║ A  ║ 5575 ║ D  ║ 
    ║ A  ║ 6532 ║ C  ║ 
    ║ A  ║ 3215 ║ D  ║ 
    ║ A  ║ 5645 ║ M  ║ 
    ║ B  ║ 3331 ║ A  ║ 
    ║ B  ║ 4445 ║ D  ║ 
    ╚══════════╩═══════╩══════════╝ 

OK我想LEFT JOIN,所以我得到的所有記錄從客戶表中,無論是否有相關記錄的條目表。不過,我想在加入之前在條目表中對類別D進行過濾。

期望的結果:

╔══════════╦═══════╦═══════╗ 
    ║ Customer ║ State ║ Entry ║ 
    ╠══════════╬═══════╬═══════╣ 
    ║ A  ║ S  ║ 5575 ║ 
    ║ A  ║ S  ║ 3215 ║ 
    ║ B  ║ A  ║ 4445 ║ 
    ║ C  ║ L  ║ NULL ║ 
    ╚══════════╩═══════╩═══════╝ 

如果我是做下面的查詢:

SELECT Customer.Customer, Customer.State, Entry.Entry 
    FROM Customer 
    LEFT JOIN Entry 
    ON Customer.Customer=Entry.Customer 
    WHERE Entry.Category='D' 

這將篩選出的最後一個記錄。

所以我想從左邊的表中的所有行,並將它加入到過濾類別上的條目表D.

感謝所有幫助提前!

回答

56

您需要的WHERE過濾器移動到JOIN條件:

SELECT c.Customer, c.State, e.Entry 
FROM Customer c 
LEFT JOIN Entry e 
    ON c.Customer=e.Customer 
    AND e.Category='D' 

SQL Fiddle with Demo

+0

哇你快速高效!這樣做的竅門,感謝您的幫助! – 2013-02-25 22:21:40

+0

完成:)再次感謝 – 2013-02-25 22:29:23

+4

@TomJenkin謝謝,順便說一下,您向該網站發佈了一個絕佳的第一個問題。很多細節等。 – Taryn 2013-02-25 22:30:01

14

你也可以這樣做:

SELECT c.Customer, c.State, e.Entry 
FROM Customer AS c 
LEFT JOIN (SELECT * FROM Entry WHERE Category='D') AS e 
ON c.Customer=e.Customer 

SQL小提琴here

+1

這也可以作爲替代!有哪些方法是首選的? – 2013-02-25 22:24:41

+1

@TomJenkin對不起,遲到的迴應,我一直在遠離計算機。不過,出於好奇,我跑了這兩個並檢查執行計劃。執行計劃幾乎完全相同,但在某種程度上更好的情況下,它似乎是Bluefeet的版本。 – 2013-02-26 13:47:06