У меня есть две таблицы с одинаковыми столбцами в одинаковом порядке. У меня есть желание присоединиться к одной из двух таблиц, в зависимости от условия подзапроса. Например, предположим, что у меня есть следующая схема:Postgres Выберите из таблицы на основе результата запроса
CREATE TABLE b (
bid SERIAL PRIMARY KEY,
cid INT NOT NULL
);
CREATE TABLE a1 (
aid SERIAL PRIMARY KEY,
bid INT NOT NULL REFERENCES b
);
CREATE TABLE a2 (
aid SERIAL PRIMARY KEY,
bid INT NOT NULL REFERENCES b
);
Я хотел бы запрос, который выполняет соединение через любой a1 или a2 на основе некоторого условия. Что-то вроде:
WITH z AS (
SELECT cid, someCondition FROM someTable
)
SELECT *
FROM CASE z.someCondition THEN a1 ELSE a2 END
JOIN b USING (bid)
WHERE cid = (SELECT cid FROM z);
Однако вышеуказанное не работает. Есть ли способ условного соединения через a1 или a2, в зависимости от некоторого булевского условия, хранящегося в таблице z?
Это интересная идея. По правде говоря, таблица * a1 * является надмножеством таблицы * a2 *, и реальный вопрос, который я задаю, заключается в следующем: 'IF EXISTS in * a2 * OR (условие AND EXISTS in * a1 *)', что похоже на отлично подходит для вашего предложения. Я могу даже переместить * UNION ALL * в другой подзапрос, поэтому я могу выполнить соединение только один раз. –
Выполнение JOIN только один раз - это, как правило, плохая идея: в моем примере два JOIN могут делать индексы. После вашего UNION индексы не будут использоваться. (BTW: joins дешевы, это не 1985 год) Примечание: в SQL нет 'IF'. Вам это не нужно: просто переместите условие в предложение WHERE. – wildplasser
Я не думаю, что аргумент индексов имеет значение для меня ... в реальных таблицах должно быть либо ноль, либо одно совпадение из таблицы * a1 * или * a2 *, и я беру этот один результат и соединяю цепочку из 4 таблиц. Я не хочу дублировать одну и ту же логику несколько раз. ПРИМЕР: 'С z AS (...), y AS (SELECT bid FROM a1 WHERE aid = 7 AND some_condition UNION ALL SELECT bid FROM a2 WHERE aid = 7 AND NOT some_condition) SELECT COUNT (1) :: INT :: BOOLEAN FROM b WHERE bid = (SELECT * FROM y) И cid = (SELECT cid FROM z) ' –