2017-09-20 25 views
0

比方說,我有如下表SQL - 加入一張桌子和所有候選條件導致

SELECT C.Id, C.Color 
FROM Color AS C 

Id Color 
------------------- 
1 Strong Red 
2 Light Red 
3 Strong Blue 
4 Light Blue 

SELECT L.Id, L.Place 
FROM Location AS L 

Id Place 
--------------- 
1 Usa 
2 Japan 

SELECT V.Id, V.PriceForADay, V.PriceForAWeek, V.ColorId, V.LocationId 
FROM Vehicules AS V 

Id PriceForADay PriceForAWeek ColorId LocationId 
---------------------------------------------------- 
1  10   15   1   1 
2  15   20   2   1 
3  20   25   1   2 

我希望得到的結果是:

SELECT 
    C.Id, C.Color, V.PriceForADay, V.PriceForAWeek, V.ColorId, 
    V.LocationId/L.LocationId 
WHERE 
    V.LocationId = 1 

Id Color  PriceForADAy PriceForAWeek ColorId LocationId 
------------------------------------------------------------------ 
1 Strong Red  10   20   1   1 
2 Light Red   15   25   2   1 
3 Strong Blue  NULL   NULL   NULL  1 
4 Light Blue  NULL   NULL   NULL  1 

我怎樣才能得到這個期望的結果?一個簡單的左連接+哪裏不工作。

謝謝

+0

加入不會在情況下工作,你試圖加入2個表中的行,其數量是不同的 –

+0

這個SQL語句是可能的,當你使用相互連接起來的表Primary/Foriegn鍵,沒有它,Join不會工作。 –

+0

左連接爲什麼不工作?顯示你已經嘗試過的完整查詢。 –

回答

1

根據您的結果,強藍和淺藍在位置1. 但是,提供的數據集在位置1中沒有那些顏色。 對於c.Id(ColorId)2,3,結果相應的ColorId爲空結果,我猜測是錯誤的。所以下面的查詢正是基於猜測的數據集: -

DECLARE @Color TABLE (Id INT IDENTITY (1,1) PRIMARY KEY, Color VARCHAR(30)) 
INSERT INTO @Color (Color) VALUES('Strong Red'), ('Light Red'),('Strong Blue'),('Light Blue') 

DECLARE @Location TABLE (Id INT IDENTITY (1,1) PRIMARY KEY, Place VARCHAR(30)) 
INSERT INTO @Location (Place) VALUES('USA'), ('Japan') 

DECLARE @Vehicules TABLE (Id INT IDENTITY (1,1) PRIMARY KEY, PriceForADay INT, PriceForAWeek INT, 
    ColorId INT, LocationId INT) 
INSERT INTO @Vehicules(PriceForADay, PriceForAWeek, ColorId, LocationId) VALUES(10,15,1,1),(15,20,2,1),(20,25,1,2) 
,(NULL,NULL,3,1),(NULL,NULL,4,1) 

--SELECT * FROM @Color 
--SELECT * FROM @Location 
--SELECT * FROM @Vehicules 

SELECT 
    C.Id, C.Color, V.PriceForADay, V.PriceForAWeek, V.ColorId 
    ,L.Id AS LocationID 
FROM @Color C LEFT JOIN @Vehicules V ON C.Id = V.ColorId 
LEFT JOIN @Location L ON V.LocationId = L.Id 
WHERE V.LocationId = 1 
+0

非常感謝你的努力!我會將這個答案標記爲正確的,因爲它是正確的,但正如您已經正確猜測的那樣,我沒有插入車輛上的最後兩行。所以我無法達到我想要的。不過謝謝! – user2823387

0

OUTER APPLY

SELECT C.Id,C.Color,V.PriceForADay,V.PriceForAWeek,V.ColorId, V.LocationId/L.LocationId 
FROM Vehicules AS V 
OUTER APPLY Color AS C 
where V.LocationId = 1 

在這裏閱讀更多:

http://sqlhints.com/tag/outer-apply-examples/

+0

完整的外連接不返回強藍色和白色藍色行。也許是因爲在哪裏? – user2823387

+0

是的,刪除where子句 –

+0

但我需要的地方!大聲笑。 – user2823387

0

這應該做的工作:

select C.Id, C.Color, V.PriceForADAy, V.PriceForAWeek, V.ColorId, L.Id 
from Colors AS C left join Vehicules AS V on C.Id = V.ColorId 
join Location AS L on V.LocationId = L.Id 
where L.Id = 1 
+0

不,它不工作,我得到所有的最後(3)缺少顏色行vechicules(100)。或者我需要300個可能的組合行。謝謝強硬 – user2823387

+0

請參閱編輯。 –