#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
, notTableA
, поэтому ваш код не является допустимым запросом.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