Функция пересечения короткого замыкания / внутреннего соединения в 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
        );
Другие вопросы по тегам