2016-03-22 71 views
1

我有一個查詢在SQL Server中,我正在做多個左連接。有一次,我去:左加入返回最多一行爲一對多的關係

...LEFT JOIN foo on a.id = foo.id AND foo.code = 100 

最多在查詢中加入語句,a.id不重複;每a.id只有1行。但是表afoo有一對多的關係,所以在該聯接語句之後,我得到了多個具有相同a.id的行。

foo將始終有多個記錄,其中foo.id = a.id,但它可能會或可能不會有記錄,其中foo.id = a.id AND foo.code = 100。如果是這樣,那麼只會有一個這樣的記錄。所以,我想在最終的查詢結果中看到每a.id只有一行;如果foo有一個記錄,其中f.id = a.id and f.code = 100,那麼我想從該記錄中看到f.date1f.date2的日期值。如果foo沒有這樣的記錄,那麼我只想看到f.date1f.date2的NULL值。從評論

編輯:

原來,表foo實際上可以有多個行,其中a.id = foo.id and foo.code = 100

+1

你會得到什麼,這不起作用?它應該基於你在那裏工作。 –

+0

也許做 選擇案例當foo.id是NULL那麼NULL否則f.date1 END作爲日期1 隨着左連接,所以當行不匹配你得到一個空的date1和做同樣的date2 –

+3

請提供樣本數據和期望的結果。你的'join'看起來不錯 - 只需從'foo'選擇你需要的字段... – sgeddes

回答

0

一種可能的方式做到這一點是使用OUTER APPLY

SELECT 
    a.id 
    ,OA_foo.date1 
    ,OA_foo.date2 
FROM 
    a 
    OUTER APPLY 
    (
     SELECT 
      -- TOP(1) 
      foo.date1 
      ,foo.date2 
     FROM foo 
     WHERE 
      foo.id = a.id 
      AND foo.code = 100 
     -- ORDER BY ... 
    ) AS OA_foo 
; 

如果你肯定知道過濾foo.id = a.id AND foo.code = 100總是只返回一行(或沒有行),那麼你就可以離開按原樣查詢。

如果可能嵌套查詢返回的行多於行,而您只想保留一行,則指定合適的ORDER BYTOP(1)