Условное присоединение к таблице в SQL - PullRequest
0 голосов
/ 27 сентября 2018

Я хотел бы объединить две таблицы, основываясь на условии параметра, который был передан в приведенный ниже пример запроса.Если это возможно, спасибо.

DECLARE @param VARCHAR(10)

SELECT A, B
FROM Table1 tb1 
JOIN Table2 tb2 ON tb1.A = tb2.A
INNER JOIN Table2 tb3 ON tb1.A = tb3.A

Теперь я хочу, чтобы приведенный выше запрос был похож на приведенный ниже.Я знаю, что это не правильно, но это образец результата, который я ищу.Если любая идея будет принята с благодарностью.

DECLARE @param VARCHAR(10)

SELECT A, B
FROM Table1 tb1 
IF (@param = 'U')
  JOIN Table2 tb2 ON tb1.A
ELSE 
  INNER JOIN Table2 tb3 ON tb1.A = tb3.A
END

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Вы можете выразить это как одиночное соединение, используя left join и coalesce() в select:

select A, coalesce(tb2.B, tb3.B) as B
From Table1 tb1 join
     Table2 tb2 
     on tb1.A = tb2.A and @param = 'U' join
     Table3 tb3 
     on tb1.A = tb3.A and @param <> 'U' and tb2.A is null;
0 голосов
/ 27 сентября 2018

Это действительно зависит от вашей ситуации и плана выполнения.Иногда целесообразно выделить особый случай в CTE и включить его в основной запрос.

WITH YourConditionalData AS (
    SELECT A, B
      FROM T2
        WHERE @param = 'U'
    UNION
      SELECT A,B
      FROM T3
        WHERE @param != 'U'
)
SELECT
   FROM T1 
   INNER JOIN YourConditionalData T ON T1.ID = T.ID

ИЛИ

WITH YourConditionalData AS (
    SELECT A, B
      FROM T1
        INNER JOIN T2 ON T1.ID = T2.ID
        WHERE @param = 'U'
    UNION
      SELECT A,B
      FROM T1
        INNER JOIN T3 ON T1.ID = T3.ID
        WHERE @param != 'U'
)
SELECT
   FROM YourConditionalData ....
0 голосов
/ 27 сентября 2018
DECLARE @param varchar(10) = 'U' 
IF @param = 'U'

  SELECT *
  FROM T1
    INNER JOIN T2 ON T1.ID = T2.ID

ELSE

  SELECT *
  FROM T1
    INNER JOIN T3 ON T1.ID = T3.ID

Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...