Функция пересечения короткого замыкания / внутреннего соединения в SQL на условии, а не на поле (PostgreSQL)
Я ищу возможность объединить две таблицы в одном условии (а не в поле) "путем короткого замыкания", при условии, что операция соединения является очень дорогой (a.field::VARCHAR содержится в обширном b.field::TEXT).
Мне не нужны дубликаты, это скорее поле "получить строки слов. Слово", которое содержится в любой книге. Поле "содержание". Если первая книга содержит его, пропустите проверку, если другие книги на 2000 страниц также содержат это.
Если я не ошибаюсь, ни INNER JOIN, ни INTERSECT не пригодятся в моей ситуации:
- Что касается INTERSECT, я не могу пересечь конкретное условие, такое как CONTAINS, поэтому мне нужно извлечь все реестры в обоих местах, выполнить декартово произведение, а затем отфильтровать, где
- Для INNER JOIN, поскольку он возвращает дубликаты, я предполагаю, что логика не является коротким замыканием, и он проверит, содержится ли мое слово в каждой из записей Книги
- IN и EXISTS также, кажется, не работают на пользовательских условиях
Есть ли способ выполнить мою потребность оптимальным образом?
1 ответ
EXPLAIN ANALYZE
SELECT * FROM words w
WHERE EXISTS ( SELECT 1 FROM books b
WHERE POSITION( w.word IN b.book) > 0
);