Вложенные джойны
Есть таблица А с данными, есть таблица 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 шт):
Да, вам надо использовать 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.
Думаю, что основной принцип понятен и у вас получится взять его за основу для решения вашей задачи.
А посмотреть как работает запрос и "поиграться" с ним можно здесь