2011-09-01 31 views
21

我希望能夠根據表達式的結果內聯兩個表。有條件的內部聯接

我一直在試圖至今:

INNER JOIN CASE WHEN RegT.Type = 1 THEN TimeRegistration ELSE DrivingRegistration AS RReg 
ON 
RReg.RegistreringsId = R.Id 

REGT是加入我做之前這個連接:

INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 

此SQL腳本不起作用。

所以總而言之,如果Type是1,那麼它應該加入表TimeRegistration否則它應該加入DrivingRegistration

解決方案:

在我的SELECT語句中我進行了以下連接:

INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
LEFT OUTER JOIN TimeRegistration AS TReg ON TReg.RegistreringsId = R.Id AND RegT.Type = 1 
LEFT OUTER JOIN DrivingRegistration AS DReg ON DReg.RegistreringsId = R.Id AND RegT.Type <>1 

然後我編輯我where-clause輸出正確,取決於RegType,就像這樣:

WHERE (CASE RegT.Type WHEN 1 THEN TReg.RegistreringsId ELSE DReg.RegistreringsId END = R.Id) 
+0

你不能這樣做! 'CASE'不能用於動態交換進出查詢的隨機部分。這些表具有相同的結構嗎? –

+0

你有錯誤嗎?如果是這樣,那是什麼? – AndrewC

回答

18

嘗試把兩個表中查詢中使用LEFT JOIN的現在

LEFT JOIN TimeRegistration TR ON r.rid = TR.Id AND RegT.type =1 
LEFT JOIN DrivingRegistration DR ON r.rid = DR.Id AND RegT.type <>1 

,在您選擇條款,使用

CASE RegType.Type WHEN 1 THEN TR.SomeField ELSE DR.someField END as SomeField 

另一種選擇是使用動態SQL

+0

看起來像偉大的思想家一樣想大衛,你只需輸入更快.... – Sparky

+0

忍者手指... – David

+0

真棒,斯帕基和大衛的建議都幫助!將我的問題編輯爲我所做的工作。 – KristianB

8

您可能需要執行兩個左連接,一個連接到TimeRegistration和一個到DrivingRegistration,並返回從相應的欄目連接表是這樣的:

LEFT JOIN TimeRegistration ON TimeRegistration.RegistreringsId = R.Id 
LEFT JOIN DrivingRegistration ON DrivingRegistration.RegistreringsId = R.Id 

,你的SELECT語句將是這樣的:

SELECT CASE WHEN RegT.Type = 1 THEN TimeRegistration.Foo ELSE DrivingRegistration.Bar END 

我喜歡你」重新嘗試去做,但我不認爲SQL很聰明。

1
SELECT 
    R.foo, tr.bar 
FROM 
    SomeTable AS R 
    INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
              AND RegT1.Type = 1 
    INNER JOIN TimeRegistration AS tr ON /* whatever */ 

UNION 

SELECT 
    R.foo, dr.bar 
FROM 
    SomeTable AS R 
    INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
              AND RegT1.Type = 2 
    INNER JOIN DrivingRegistration AS dr ON /* whatever */ 
+0

+1,儘管可能需要'UNION ALL'。如果這些表是Union兼容的,那麼這些表可以在帶有'type'列的CTE中,以避免重複'JOIN'邏輯,儘管不知道執行計劃是什麼樣子。 –

+0

@Martin:有了正確的索引,這兩個連接應該足夠快。我假設由於兩個目標表不同,UNION ALL不是必需的。 – Tomalak