#sql #postgresql
Вопрос:
У меня есть следующая инструкция sql:
WITH subquery AS ( select distinct id from a_table where some_field in (1,2,) ) select id from another_table where id in subquery;
Редактировать
ПРИСОЕДИНИТЬСЯ-это не вариант (это просто уменьшенный пример более крупного запроса).
Но это, очевидно, не работает. id
Поле существует в обеих таблицах (с разным именем, но значения одинаковые: числовые идентификаторы). В основном то, что я хочу сделать, — это отфильтровать результат подзапроса, как своего рода пересечение.
Есть идеи, как правильно написать этот запрос?
Комментарии:
1.
... IN (SELECT id FROM subquery) ...
Но я бы рекомендовал переписать его какJOIN
.2. Но выполняет ли эта строка выбор для каждой строки
another_table
? Я знаю о возможности ОБЪЕДИНЕНИЯ, но это невозможно (это просто сокращенный пример другого запроса).3. Зависит от того, что оптимизатор «считает» лучшим. Но обычно нет. CTE может даже материализоваться.
4. О, здорово! Можете ли вы опубликовать это в качестве ответа? 😀
5. Для простого поиска я бы не присоединился, но использовал
IN
илиEXISTS
. Вы только неправильно поняли синтаксис. пункт «липкий бит» должен отлично работать для вас.
Ответ №1:
Вам нужен подзапрос для второго операнда IN
этого SELECT
s из CTE.
... IN (SELECT id FROM subquery) ...
Но я бы рекомендовал переписать его как JOIN
.
Ответ №2:
Можете ли вы присоединиться по идентификатору, а затем отфильтровать предложение Where?
select a.id from a.table inner join b.table on a.id = b.id where b.column in (1,2)
Комментарии:
1. Я не могу использовать JOIN, извините 🙁
Ответ №3:
Так как вам нужно только id
another_table
то, что вы можете использовать exists
with s as ( select id from a_table where some_field in (1,2) ) select id from another_table t where exists ( select * from s where s.id=t.id )
Но CTE действительно излишен, так как все, что вы делаете, это
select id from another_table t where exists ( select * from a_table a where a.id=t.id and a.some_field in (1,2) )