Декоррелируйте запрос с помощью полусоединения

#database #multiset #semi-join

#База данных #мультимножество #полусоединение

Вопрос:

Я новичок в оптимизации запросов, как использовать полусоединение при реализации декорреляции, я не могу полностью понять.

Рассмотрим запрос

         SELECT A, B
        FROM r
        WHERE r.B < SOME (
            SELECT B
            FROM s
            WHERE s.A = r.A
       )
  

Покажите, как декоррелировать приведенный выше запрос, используя версию с несколькими наборами
операция полусоединения

Ответ №1:

Вы можете написать свой запрос с использованием внутреннего соединения следующим образом:

 SELECT DISTINCT r.A, r.B
FROM r
INNER JOIN s
    ON r.A = s.A
WHERE r.B < s.B;
  

DISTINCT Предложение необходимо в этой версии вашего запроса, потому что данная запись в r таблице потенциально может присоединиться к нескольким совпадениям в s таблице. В вашей исходной версии не может быть дубликатов, из-за SOME предложения, которое принимает набор записей, any всегда возвращает один ответ «да» / «нет».