Как лучше оптимизировать вот такой запрос с IN и NOT IN?

Господа гуру SQL!
подскажите, как лучше оптимизировать вот такой некрасивый запрос:
SELECT 
  objectId 
FROM 
  objects 
WHERE objectId NOT IN 
                     (SELECT 
                        objectId 
                      FROM 
                        objects_categories 
                      WHERE 
                        objectCat NOT IN (
                                                      select 
                                                         deviceCat 
                                                       FROM 
                                                         device_categories 
                                                      WHERE 
                                                         deviceId=1
                                                   )
                    )


Таблица objects -основная, две связующие таблички objects_categories и device_categories содержат по 2 поля:
objectId, categoryId (для objects_categories)
deviceId, deviceCat (для device_categories)

тоесть суть такова, что мне нужно вывести те объекты, в которых нет категорий, отсутствующих в device_categories для девайса №1

Буду очень признателен!
  • Вопрос задан
  • 3190 просмотров
Решения вопроса 1
wrmax
@wrmax
select o.objectId
from objects o
left join

(select objectId from objects_categories t1 left join device_categories t2
on t1.objectCat = t2.deviceCat
where t2.deviceCat is null or t2.deviceId<>1)
oc on
oc.objectId =o.objectId
WHERE oc.objectId IS NULL;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
knekrasov
@knekrasov
Первое, что пришло на ум (не проверял):
select o.objectId from objects o
where not exists (
  select * from 
    object_category oc  
    join device_category dc on oc.categoryId = dc.deviceCat
    where dc.deviceId = 1 
      and o.objectId = oc.objectId
)

Ответ написан
Sorok7
@Sorok7
Как вариант, если есть возможность, сначала выполнить запрос

select 
deviceCat 
FROM 
device_categories 
WHERE 
deviceId=1


Предположим, получите, значения: 1,2,4,5,7,8.
Затем выполнить запрос:

SELECT 
objectId 
FROM 
objects_categories 
WHERE 
objectCat NOT IN (1,2,4,5,7,8)


И далее основной запрос по аналогичной логике.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы