【问题标题】:Find groups that do not contain any NULL value查找不包含任何 NULL 值的组
【发布时间】:2019-08-04 05:47:05
【问题描述】:

我有一个名为 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
}

我查看了 group by 和 have,但以下脚本返回所有记录

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

提前致谢

【问题讨论】:

  • 如果您添加示例数据和预期结果可能会更清楚
  • @skeffin 查看修改后的答案。

标签: sql sql-server tsql aggregate-functions


【解决方案1】:

您可以使用GROUP BYHAVING。以下工作是因为NULL 值不是COUNTed:

SELECT ObjectId
FROM ObjectOwner
GROUP BY ObjectId
HAVING COUNT(*) = COUNT(EndDate)

【讨论】:

  • 我认为这会选择结束日期为空的记录...... OP 想要没有的记录。
  • 实际上...真可惜...这也行不通...因为大多数记录(旧的所有权记录)都符合要求。
  • 是的 - 很抱歉......是的 ;-) 我还在考虑 sans-group-by。
【解决方案2】:

如果你写<...> = 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
)

【讨论】:

  • 这根本不返回任何记录-我承认我对为什么这不起作用感到困惑
  • 我可以帮助你,给我一个数据库小提琴与你的数据和这个查询。
猜你喜欢
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2012-11-20
  • 2021-07-16
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多