multiple inner columns sql sql-server tsql join inner-join

sql - columns - loopback inner join



Conditional Inner Join (3)

Quiero poder unir dos tablas internas en función del resultado de una expresión.

Lo que he estado intentando hasta ahora:

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

RegT es una unión que hice justo antes de esta unión:

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

Este script SQL no funciona.

Así que, en general, si Type es 1, entonces debería unirse a la tabla TimeRegistration contrario debería unirse en DrivingRegistration .

Solución:

En mi declaración selecta realicé las siguientes uniones:

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

Luego RegType mi where-clause para dar salida a la correcta, dependiendo del RegType , así:

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


Es probable que deba realizar dos uniones a la izquierda, una en TimeRegistration y otra en DrivingRegistration , y devolver los campos que desee de la tabla de combinación adecuada, algo como esto:

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

y seleccionas una declaración sería algo como esto:

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

Me gusta lo que intentas hacer, pero no creo que SQL sea tan inteligente.


Intenta poner ambas tablas en la consulta usando LEFT JOIN''s

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

Ahora, en tu cláusula de selección, usa

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

La otra opción es usar SQL dinámico


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 */