Вложенные джойны

Есть таблица А с данными, есть таблица B, которая содержит имена настроек, есть таблицы C и D, которые хранят значения настроек. Нужно при выборке из таблицы А подтянуть значение настройки из таблицы C, либо из таблицы D (если в C нет).

Написал пока вот что:

select a.*, c.value as value
from a
left join c
    on a.id = c.a_id
    and c.setting_id in (select id from b 
        where b.type_id = a.type_id 
        and (b.code = 'Настройка для типа 1' or b.code = 'Настройка для типа 2'))

Но я не сообразил, как добавить таблицу D. Подозреваю, что нужно внутри джойна сделать ещё один джойн, в котором объединять значения из C и D.


Ответы (1 шт):

Автор решения: Vladimir Ignatenko

Да, вам надо использовать join. Только не вложенные, а идущие друг за другом - если объяснять по простому.

Плюс вы можете использовать функцию COALESCE(val1, val2) которая возвращает ненулевое значение.

Запрос будет примерно таким:

SELECT a.*, COALESCE(c.value, d.value) AS value
FROM a
LEFT JOIN c ON a.id = c.id_a
LEFT JOIN d ON a.id = d.id_a;

Тут делается выборка из таблицы a и делаются два LEFT JOIN к таблицам c и d. Если в таблице c нет записи, которая соответствует значению из таблицы а, то c.value будет равно NULL. В этом случае функция COALESCE вернет значение для d.value.

Думаю, что основной принцип понятен и у вас получится взять его за основу для решения вашей задачи.

А посмотреть как работает запрос и "поиграться" с ним можно здесь

→ Ссылка