Получить все записи, где ВСЕ связанные записи равны строке - PullRequest
0 голосов
/ 18 марта 2012

У меня есть 2 таблицы.Один содержит список проектов, а другой содержит список задач в этих проектах.

Я хочу получить список только тех проектов, у которых все задачи имеют статус «Выполнено».

Мои данные выглядят так:

Таблица проектов:

ID,ProjectName,ProjectStatus

Таблица задач:

ID, ProjectID, TaskName, TaskStatus

Tasks.ProjectID = Projects.ID

Я могу сделатьбазовый оператор выбора для получения всех записей и фильтрации, где TaskStatus является конкретным состоянием, но опять же, мне нужен только список проектов, в которых ВСЕ задачи выполнены.

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 18 марта 2012

вы можете использовать подзапрос NOT EXISTS:

select * 
  from Projects P
 where NOT EXISTS (select 1 from Tasks where Tasks.ProjectID = P.ID and TaskStatus <> 'COMPLETE')

Изменить до завершения

Вы также можете использовать подзапрос NOT IN:

select *
  from Projects
 where ID NOT IN (select ProjectID from Tasks where TaskStatus = 'COMPLETE')

Будет ли использоваться один или другой, это будет зависеть от объема данных вашей таблицы и индексов:

Первый параметр будет запускать подзапрос для каждой строки родительского запроса, но получит доступ (если существует,вероятно, да) по индексу ProjectID.

Второй вариант сначала запускает подзапрос, только один раз, а затем запускает родительский запрос, используя результаты подзапроса.Но подзапрос, вероятно, не будет использовать какой-либо индекс, поскольку вряд ли он будет иметь индекс в поле TaskStatus (это не имеет особого смысла).

Но, опять же, если у вас их немногострок в таблице «Задачи», тогда никакой индекс не будет использоваться в любом случае, так как было бы дешевле сделать полное сканирование таблицы.Поэтому я рекомендую проверить план выполнения, сравнить затраты и, если возможно, выполнить несколько тестов, чтобы решить, какой вариант лучше подходит для этого или любого другого случая.

0 голосов
/ 18 марта 2012

попробуйте это:

SELECT ID, ProjectName            -- This query will select all projects where
FROM Projects                     -- ID is not on the list of the subquery
WHERE ID  NOT IN                                    
        ( SELECT ProjectID                    -- This subquery will get all
          FROM Tasks                          -- ProjectID who has INCOMPLETE
          WHERE TaskStatus <> 'COMPLETE')     -- taskStatus
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...