#sql #sql-server #tsql #join
#sql #sql-сервер #tsql #Присоединиться
Вопрос:
У меня есть две функции. Мне нужно решить, следует ли объединяться с этими двумя на основе БИТОВОГО значения.
ON APEL.data_Period_dataination_Lookup_ID = CCEL.data_Period_dataination_Lookup_ID
INNER JOIN markcommon.GetPredecessordatadataIds() AS PIDS
IF @Combined_Flag=1
BEGIN
ON PIDS.data_Period_dataination_Identifier = APEL.data_Period_dataination_Identifier
AND PIDS.data_Period_Identifier = APL.data_Period_Identifier
END
В основном
если БИТ = 0, соедините с функцией 1, иначе соедините с функцией 2
Я попытался ввести предложение IF .. но, похоже, это не работает. Как правильно это сделать?
Комментарии:
1. @DaleK затем соединяется с другой функцией.
2. @DaleK Мне советуют использовать условие if и temptable, а не объединения.
3. Кем и почему? У вас должен быть очень сложный запрос с большим количеством строк, чтобы нуждаться в этом решении, ИМХО. Одна особенность SQL заключается в том, что вы не хотите тратить слишком много времени, пытаясь предотвратить проблемы с производительностью. Встроенный оптимизатор обычно довольно хорош. Если есть проблема с производительностью, вы решаете, как ее решить.
4. @DaleK Моим архитектором, один из данных всегда будет нулевым, и я присоединяюсь без необходимости.. она говорит..
5.Пожалуйста, приведите документацию, которую вы нашли для
if
предложения.
Ответ №1:
Просто добавьте ваше статическое условие как часть условия соединения и используйте a LEFT JOIN
, чтобы убедиться, что оно работает с отсутствующей строкой. Затем вы можете использовать case
выражение в своем выборе, чтобы получить правильный столбец, например
SELECT
CASE WHEN F1.id IS NOT NULL THEN F1.MyColumn ELSE F2.MyColumn END
FROM ...
LEFT JOIN markcommon.Function1() AS F1
ON @Combined_Cohort = 1
AND {The rest of the join conditions}
LEFT JOIN markcommon.Function2() AS F2
ON @Combined_Cohort = 0
AND {The rest of the join conditions}
Ответ №2:
Я думаю, вы можете просто использовать LEFT JOIN
:
ON APEL.data_Period_dataination_Lookup_ID = CCEL.data_Period_dataination_Lookup_ID LEFT JOIN
markcommon.GetPredecessordatadataIds() PIDS
ON @Combined_Cohort = 1 AND
PIDS.data_Period_dataination_Identifier = APEL.data_Period_dataination_Identifier AND
PIDS.data_Period_Identifier = APL.data_Period_Identifier
. . .
WHERE @Combined_Cohort <> 1 OR PIDS.data_Period_dataination_Identifier IS NOT NULL
Ответ №3:
Вы можете использовать LEFT JOIN
следующее:
APEL.data_Period_dataination_Lookup_ID = CCEL.data_Period_dataination_Lookup_ID
LEFT JOIN markcommon.GetPredecessordatadataIds() AS PIDS
ON (@Combined_Flag=1 AND PIDS.data_Period_dataination_Identifier = APEL.data_Period_dataination_Identifier
AND PIDS.data_Period_Identifier = APL.data_Period_Identifier
)
LEFT JOIN FUNCTION2() AS PIDS2
ON (@Combined_Flag=0 AND <<join condition for function 2>>
)
Ответ №4:
Пожалуйста, также проверьте:
SELECT
IIF(F1.id IS NOT NULL,F1.MyColumn,F2.MyColumn)
FROM ...
LEFT JOIN markcommon.Function1() AS F1
ON @Combined_Cohort = 1
AND {The rest of the join conditions}
LEFT JOIN markcommon.Function2() AS F2
ON @Combined_Cohort != 1
AND {The rest of the join conditions}
Комментарии:
1. Пожалуйста, не размещайте в своем ответе несвязанные ссылки — они будут рассматриваться как спам, а ваш ответ будет удален. Кроме того, что ваш ответ добавляет к 3 существующим ответам?