Kri*_*anB 23 sql t-sql sql-server join inner-join
我希望能够根据表达式的结果内部连接两个表.
到目前为止我一直在努力:
INNER JOIN CASE WHEN RegT.Type = 1 THEN TimeRegistration ELSE DrivingRegistration AS RReg
ON
RReg.RegistreringsId = R.Id
Run Code Online (Sandbox Code Playgroud)
RegT是我在此加入之前创建的联接:
INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id
Run Code Online (Sandbox Code Playgroud)
此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
Run Code Online (Sandbox Code Playgroud)
然后我编辑我where-clause
的输出正确,取决于RegType
,像这样:
WHERE (CASE RegT.Type WHEN 1 THEN TReg.RegistreringsId ELSE DReg.RegistreringsId END = R.Id)
Run Code Online (Sandbox Code Playgroud)
Spa*_*rky 20
尝试使用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
Run Code Online (Sandbox Code Playgroud)
现在,在你的select子句中,使用
CASE RegType.Type WHEN 1 THEN TR.SomeField ELSE DR.someField END as SomeField
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用动态SQL
您可能需要执行两个左连接,一个进入TimeRegistration
和一个进入DrivingRegistration
,并从相应的连接表返回您想要的字段,如下所示:
LEFT JOIN TimeRegistration ON TimeRegistration.RegistreringsId = R.Id
LEFT JOIN DrivingRegistration ON DrivingRegistration.RegistreringsId = R.Id
Run Code Online (Sandbox Code Playgroud)
你选择语句会是这样的:
SELECT CASE WHEN RegT.Type = 1 THEN TimeRegistration.Foo ELSE DrivingRegistration.Bar END
Run Code Online (Sandbox Code Playgroud)
我喜欢你想做的事,但我不认为SQL是那么聪明.