2011-12-08 64 views
3

我有以下查詢:SQL - 加入問題

SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID 
FROM Rates AS rt 
LEFT OUTER JOIN VehicleTypeCostsBreakdown AS vtb ON rt.ID = vtb.RateID 
LEFT OUTER JOIN VehicleTypeCostsDepots AS vtd ON vtd.ID = vtb.VehicleTypeDepotID AND vtd.DepotID = @DepotID AND vtd.VehicleTypeID = @VehicleTypeID 

基本上,我想選擇從價格表中的所有「變化率」,但如果以一個速度的任何引用存在於「VTD」表,該表具有匹配@DepotID和@VehicleTypeID的參數,我想爲此返回值。如果它沒有任何引用,我希望它的'vtb.Value'選擇是空白的。

使用上面的SQL,它似乎總是返回'vtb.Value'值的值,即使參數爲空。我錯過了什麼嗎?

+0

當你說你總是得到vtb.Value返回值即使參數爲null,是vtb.Value返回爲NULL,或者你得到的實際值? –

回答

2

試試這個方法。基本上,您將LEFT JOIN添加到由VehicleTypeCostsBreakdown和VehicleTypeCostsDepots之間的INNER JOIN形成的派生表。 INNER JOIN只有在所有條件都成立時纔會匹配。

SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID 
    FROM Rates AS rt 
     LEFT OUTER JOIN VehicleTypeCostsBreakdown AS vtb 
      INNER JOIN VehicleTypeCostsDepots AS vtd 
       ON vtd.ID = vtb.VehicleTypeDepotID 
        AND vtd.DepotID = @DepotID 
        AND vtd.VehicleTypeID = @VehicleTypeID 
      ON rt.ID = vtb.RateID 
+0

對外部聯接外部表的內部聯接將其重新轉換爲內部聯接,就像WHERE子句那樣。 –

+0

@MarkBannister - 查看'ON'子句的位置。邏輯上,'LEFT JOIN'最後發生。這也可以更直接地寫成「RIGHT JOIN」。 [查看我的答案在這裏的具體例子](http://stackoverflow.com/a/7313507/73226) –

+0

如何整潔,我沒有意識到你可以做到這一點! (我會刪除我之前的評論,但馬丁的迴應看起來有點奇怪。) –

0

試試這個:

SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID 
FROM Rates AS rt 
LEFT JOIN VehicleTypeCostsBreakdown AS vtb ON rt.ID = vtb.RateID 
LEFT JOIN VehicleTypeCostsDepots AS vtd ON vtd.ID = vtb.VehicleTypeDepotID 
WHERE vtd.ID IS NULL OR (vtd.DepotID = @DepotID AND vtd.VehicleTypeID = @VehicleTypeID) 

你並不需要指定的LEFT JOINOUTER JOIN,你不應該把條件在JOINON部分,這就是WHERE是。

+4

如果您從WHERE子句中的LEFT JOINed表中引用列,則強制該連接的行爲就像是INNER JOIN一樣。 –

+0

@JoeStefanelli:確實,改變了我的答案。感謝您指出了這一點。 – mbillard

0

嘗試:

SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID 
FROM Rates AS rt 
LEFT OUTER JOIN (SELECT b.ID, b.Value, b.RateID 
       FROM VehicleTypeCostsBreakdown AS b 
       JOIN VehicleTypeCostsDepots AS d 
        ON d.ID = b.VehicleTypeDepotID AND 
         d.DepotID = @DepotID AND 
         d.VehicleTypeID = @VehicleTypeID) 
      AS vtb ON rt.ID = vtb.RateID