2011-09-01 90 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