Найти группы, которые не содержат значения NULL - PullRequest
4 голосов
/ 13 марта 2019

У меня есть таблица «многие ко многим» с именем dbo.ObjectOwner, имеющая следующие столбцы:

ObjectId |  OwnerId | StartDate |EndDate

Где ObjectId, OwnerId не является первичным ключом, а Startdate и Enddate ссылаются на даты, когда Object принадлежит Owner.

запрос, который я пытаюсь сделать, должен вернуть все ObjectId где для каждого ObjectId, он не имеет связанных записей, где EndDate равен нулю. Т.е. вернуть все объекты, у которых в данный момент нет владельца.

так что-то вроде

foreach(objectId in dbo.ObjectOwner)
if ( 
        doesnotexist (records where ObjectId = objectid and EndDate is null)
   )
{
   add this objectid to the select table
}

Я посмотрел на группу по порядку, но следующий скрипт возвращает все записи

SELECT oo.ObjectId
FROM    dbo.ObjectOwner oo
GROUP BY oo.ObjectId
HAVING NOT EXISTS (
    SELECT  1
    FROM    dbo.ObjectOwner
    WHERE   dbo.ObjectOwner.EndDate = null
)

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вы можете использовать GROUP BY и HAVING.Следующее работает, потому что NULL значения не COUNT ed:

SELECT ObjectId
FROM ObjectOwner
GROUP BY ObjectId
HAVING COUNT(*) = COUNT(EndDate)
2 голосов
/ 13 марта 2019

Это не может работать, если вы напишите <...> = NULL, потому что NULL не может быть чем-то равным.

SELECT oo.ObjectId
FROM    dbo.ObjectOwner oo
GROUP BY oo.ObjectId
HAVING NOT EXISTS (
    SELECT  1
    FROM    dbo.ObjectOwner
    WHERE   dbo.ObjectOwner.EndDate IS NULL
)
...