#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 всегда возвращает один ответ «да» / «нет».