У меня есть две функции. Мне нужно решить, присоединяться ли к этим двум на основе значения BIT.
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
По сути
если BIT=0 присоединиться к функции 1 иначе присоединиться к функции 2
Я пытался поставить IF Clause .. но, похоже, это не сработало. Как правильно это сделать?
@DaleK Мне советуют использовать условие if и temptable, а не соединения.
Кем и почему? Вам нужно будет иметь очень сложный запрос с большим количеством строк, чтобы нуждаться в этом решении ИМХО. Одна особенность SQL заключается в том, что вы не хотите тратить слишком много времени, пытаясь упредить проблемы с производительностью. Встроенный оптимизатор обычно довольно хорош. Если есть проблема с производительностью, вы решаете, как ее решить.
@DaleK По словам моего архитектора, один из данных всегда будет нулевым, и я присоединяюсь без необходимости .. она говорит ..
@DaleK конечно .. спасибо ....
@DaleK Пожалуйста, посмотрите stackoverflow.com/questions/65245956/…
Пожалуйста, укажите документацию, которую вы нашли для пункта if
.
Я думаю, вы можете просто использовать 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
Просто добавьте свое статическое условие как часть условия соединения и используйте 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}
Вы можете использовать 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>>
)
Пожалуйста, также проверьте:
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}
Пожалуйста, не размещайте несвязанные ссылки в своем ответе - они будут рассматриваться как спам, а ваш ответ будет удален. Кроме того, что ваш ответ добавляет к трем существующим ответам?
@DaleK затем присоединитесь к другой функции.