2011-06-17 28 views
1

我想知道如果這個查詢可以進行修改,以達到我想要的:SQL總是返回從LUT中的所有行每個ID

SELECT 
cv.[ID] 
,cv.[CustomValue] 
,cf.[SpecialInformationId] 
FROM #CustomFields cf 
FULL OUTER JOIN #CustomValues cv ON cf.SpecialInformationId = cv.id 

這將返回所有cv.Id的。它還返回任何不匹配的cf.SpecialInformationId,其中的cv信息爲NULL。我真正想要的是每個cv實例,我希望每個cf都能顯示出來。 cf是查找表。在這種情況下有12個值,但每次查詢運行時都會有所不同。這裏有一個例子:

什麼該查詢當前返回:

cv.id cv.customvalue cf.specialinformationid 
1   003   1 
1   abc   2 
2   004   1 
2   1/1/2010  4 
2   abc   2 
3   009   1 
4   003   1 
4   acb   2 
4   1/2/2010  4 

我想它返回什麼:

cv.id cv.customvalue cf.specialinformationid 
1   003    1 
1   abc    2 
1   NULL    3 
1   NULL    4 
1   NULL    5 
2   004    1 
2   abc    2 
2   NULL    3 
2   1/1/2010   4 
2   NULL    5 
3   009    1 
3   NULL    2 
3   NULL    3 
3   NULL    4 
3   NULL    5 
4   003    1 
4   acb    2 
4   NULL    3 
4   1/2/2010   4 
4   NULL    5 

左連接無法使用,因爲在只有12行查找表,所以如果使用左連接,則會獲得與完整外連接相同的結果。

這是我的其他問題的一個副產品: SQL 2 tables always return all rows from 1 table match existing on other

感謝

+0

第一個查詢的結果似乎不符合您的查詢,您確定結果?如果你正在做cf.SpecialInformationId = cv.id,那麼cf.specialinformationid和cv.id是等於的,或者其中一個是空的,但是這兩個不能有一個值AND是不同的。 –

回答

0

問題的產生是因爲您的Table2並非真正的「車輛」表。因爲VehicleId沒有唯一標識該表中的記錄。這是所有混淆來自的地方。所以爲了解決這個問題並讓你的問題開始工作,我在table2上對錶1中的值做了select distinct選項(爲了清晰起見,我也做了一個清晰的選擇,但沒有必要。)希望這有助於。

CREATE TABLE #Table1 (Id INT) 
CREATE TABLE #Table2 (VehicleID INT, Value VARCHAR(50), Table1ID INT) 

INSERT INTO #Table1 VALUES (1),(2),(3),(4),(5) 
INSERT INTO #Table2 VALUES (1, 't', 1),(1, 'q', 2),(3, 'w', 3),(3, 'e', 4),(4, 't', 1),(5, 'e', 1),(5, 'f', 2),(5, 'g', 4) 

SELECT * FROM #Table1 
SELECT * FROM #Table2 

SELECT t2.VehicleID, t2.Value 
FROM (SELECT t2.VehicleId, t1.Id 
      FROM  (SELECT DISTINCT 
           VehicleId 
         FROM  #Table2) t2 
        CROSS JOIN (SELECT Id 
           FROM #Table1) t1) Base 
     LEFT JOIN #Table2 t2 
      ON Base.VehicleId = t2.VehicleID 
       AND Base.Id = t2.Table1ID 
WHERE (Base.VehicleId BETWEEN 1 AND 3) 

DROP TABLE #Table1 
DROP TABLE #Table2 
+0

太棒了。有一個非常接近的變化工作。謝謝。 – mameesh

1

我相信CROSS JOIN將實現你正在尋找的結果。

+0

我知道這可以在SQL Server和Oracle中工作。不知道還有什麼其他數據庫 –

相關問題