Передача таблицы для соединения с использованием оператора CASE WHEN

#sql #left-join #inner-join

#sql #слева -соединение #внутреннее соединение

Вопрос:

Я пытаюсь использовать оператор CASE WHEN, чтобы определить, какую таблицу использовать для второй половины соединения. Например, есть 3 таблицы: TableA, TableB, TableC.

 SELECT a.column1, b.column2
FROM
TableA as a
FULL OUTER JOIN
CASE WHEN condition1 THEN TableB as b
ELSE TableC as b
END
ON a.ID = b.ID

Example:

TableA
ID: 1 2 3
Column1: 10 20 30

TableB
ID: 1 2 3
Column2: 100 200 300

TableC
ID: 1 2 3
Column2: 1000 2000 3000

-- Result 1 --> CASE WHEN statement is true, TableA and TableB are joined

Column1: 10 20 30
Column2: 100 200 300

-- Result 2 --> CASE WHEN statement is false, TableA and TableC are joined

Column1: 10 20 30
Column2: 1000 2000 3000
 
  

Я всегда хочу использовать TableA для соединения, но затем, в зависимости от определенного условия, я хочу присоединиться либо к TableB, либо к TableC. Независимо от того, какая вторая таблица используется для соединения, я хочу, чтобы на нее ссылались как на «b», чтобы условие ON могло просто использовать b.ID и оператор SELECT всегда будет использовать b.column2

Комментарии:

1. Пожалуйста, предоставьте образцы данных и желаемые результаты. SQL-запрос начинается с SELECT , not TableA , поэтому ваш код не является допустимым запросом.

2. (1) У вас не может быть двух таблиц с одинаковым псевдонимом в одном from предложении, поэтому последняя часть вашего вопроса просто невозможна (2) Пожалуйста, предоставьте образцы данных и желаемые результаты; то, что вы просите, все еще, вероятно, выполнимо, хотя и не так, как вы себе представляете.

3. Добавлен пример!

Ответ №1:

Вы можете left join дважды. Условие переходит к on предложению каждого соединения:

 select a.col1, coalesce(b.col2, c.col2) as col2
from tablea a
left join tableb b 
    on  b.id = a.id
    and (condition)      -- condition is met
left join tablec c 
    on  c.id = a.id   
    and not (condition)  -- condition is not met
  

Комментарии:

1. Файл, с которым я работаю, очень большой, и для создания таблиц A, TableB и TableC требуется довольно много времени, поэтому я надеялся избежать запроса TableB или TableC, если они не нужны. Если я правильно понимаю, приведенный выше код ВСЕГДА будет запрашивать TableB и TableC независимо от того, используются ли они, верно? Интересно, есть ли способ запрашивать только для 2 таблиц, которые мне нужны.

2. @Matt: база данных примет решение, к какой таблице следует обращаться или нет. Не оптимизируйте преждевременно. Адаптируйте запрос к вашему реальному варианту использования, затем протестируйте его и посмотрите, что произойдет.

Ответ №2:

Вы можете объединить две таблицы, включая условие, чтобы получить строки одного или другого:

 SELECT a.column1, b.column2
FROM TableA a
FULL OUTER JOIN
(
  SELECT id, column2 FROM TableB WHERE <condition>
  UNION ALL
  SELECT id, column2 FROM TableC WHERE NOT <condition>
) b ON a.id = b.id