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

#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 существующим ответам?