Выделение всего объекта, для которого не существует значения - PullRequest
2 голосов
/ 19 марта 2010

У меня есть две таблицы: объект со столбцом object_id и значения, которые имеют object_id (FK для object.object_id) и value_type (для простоты я опустил другие столбцы).

Я хочу выбрать все объекты, которые не имеют значений с указанным типом. Мой выбор выглядит так:

SELECT object_id FROM object WHERE NOT EXISTS (SELECT true FROM avalues v WHERE v.value_type = 10 and v.object_id = object_id); 

Есть ли более эффективный способ сделать это?

1 Ответ

3 голосов
/ 19 марта 2010

NOT IN и LEFT JOIN / IS NULL немного более эффективны:

SELECT  object_id
FROM    object
WHERE   object_id NOT IN
        (
        SELECT object_id
        FROM   avalues v
        WHERE  v.value_type = 10
        )

или

SELECT  o.object_id
FROM    object o
LEFT JOIN
        avalues v
ON      v.object_id = o.object_id
        AND v.value_type = 10
WHERE   v.object_id IS NULL

Убедитесь, что у вас есть индекс на avalues (object_id, value_type)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...