Условное внутреннее соединение с двумя функциями

У меня есть две функции. Мне нужно решить, присоединяться ли к этим двум на основе значения 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 затем присоединитесь к другой функции.

techno 10.12.2020 03:34

@DaleK Мне советуют использовать условие if и temptable, а не соединения.

techno 11.12.2020 05:27

Кем и почему? Вам нужно будет иметь очень сложный запрос с большим количеством строк, чтобы нуждаться в этом решении ИМХО. Одна особенность SQL заключается в том, что вы не хотите тратить слишком много времени, пытаясь упредить проблемы с производительностью. Встроенный оптимизатор обычно довольно хорош. Если есть проблема с производительностью, вы решаете, как ее решить.

Dale K 11.12.2020 05:31

@DaleK По словам моего архитектора, один из данных всегда будет нулевым, и я присоединяюсь без необходимости .. она говорит ..

techno 11.12.2020 05:41

@DaleK конечно .. спасибо ....

techno 11.12.2020 05:50

@DaleK Пожалуйста, посмотрите stackoverflow.com/questions/65245956/…

techno 11.12.2020 05:53

Пожалуйста, укажите документацию, которую вы нашли для пункта if.

HABO 12.12.2020 05:07
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
7
147
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я думаю, вы можете просто использовать 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}

Пожалуйста, не размещайте несвязанные ссылки в своем ответе - они будут рассматриваться как спам, а ваш ответ будет удален. Кроме того, что ваш ответ добавляет к трем существующим ответам?

Dale K 10.12.2020 04:08

Другие вопросы по теме