Условное внутреннее соединение
Я хочу, чтобы внутреннее объединение двух таблиц основано на результате выражения.
То, что я пытался до сих пор:
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- script не работает.
Итак, в целом, если Type
равно 1, тогда он должен присоединиться к таблице TimeRegistration
else, к которой он должен присоединиться на 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)
Ответы
Ответ 1
Попробуйте поместить обе таблицы в запрос, используя 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
Ответ 2
Вероятно, вам нужно выполнить два левых соединения, один на TimeRegistration
и один на DrivingRegistration
, и вернуть нужные поля из соответствующей таблицы соединений примерно так:
LEFT JOIN TimeRegistration ON TimeRegistration.RegistreringsId = R.Id
LEFT JOIN DrivingRegistration ON DrivingRegistration.RegistreringsId = R.Id
и вы выберете оператор:
SELECT CASE WHEN RegT.Type = 1 THEN TimeRegistration.Foo ELSE DrivingRegistration.Bar END
Мне нравится то, что вы пытаетесь сделать, но я не думаю, что SQL это умный.
Ответ 3
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 */