У меня есть следующие таблицы:
- заказ
- сообщение: содержит столбец order_id, который является внешним ключом к таблице заказов
- обзор: отслеживает, какие пользователи просмотрели заказ, содержит столбец order_id, который является внешним ключом для таблицы заказов, и идентификатор user_id, который является внешним ключом для таблицы пользователя
- пользователь: отслеживает пользователя в системе, который может иметь или не иметь назначенную роль; содержит столбец role_id, который является внешним ключом таблицы ролей
- роль: отслеживает особую роль для данного пользователя
Сообщение относится к заказу, и его могут просматривать многие пользователи. Каждому пользователю может быть назначена или не назначена особая роль. Я хочу вернуть только те сообщения, которые не были просмотрены ЛЮБЫМИ пользователями, которым была назначена специальная роль. Я написал запрос для этого, который опирается на коррелированный подзапрос (внутренний SELECT ссылается на message.order_id из внешнего SELECT). Это допустимо в T-SQL, но очень медленно.
Какой способ написания запроса более эффективен?
select message.id
from message, order
where order.id = message.order_id
and not exists (select *
from user, review
where user.role_id is not null and
user.id = review.user_id and
review.order_id = message.order_id)