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