SQL "Where Not Exists"未返回任何行

标签 sql sql-server

这是我想要实现的目标: 1.从users表中提取用户ID(documents.ownerID是Users.Handle的外键) 2. 对于在过去 90 天内没有在文档表中创建的记录的用户

这是我到目前为止的查询(我通过 SQL Studio Management 2012 运行该查询):

Select Users.UserID 
From Documents  
Inner Join Users on documents.OwnerID = users.handle
Where Not Exists
(
Select * 
From Documents
Where documents.creationtime >= Dateadd(day, -90, getutcdate())
)
Group by Users.UserID
Order by Users.UserID ASC

输出中没有返回任何内容。但是,当我从“不存在”语句中删除“不”时,我得到了在过去 90 天内在文档表中创建了记录的用户的输出。另外,如果我将 ">= 指示符更改为“=”,我也会收到输出。我认为问题在于我对 EXIST 语句没有牢固的理解。我非常感谢你的帮助。

最佳答案

原因是因为你的子查询不相关。因此,where 子句的意思是:创建时间超过 90 天的文档中不存在任何记录。存在这样的记录,因此 where 子句总是失败。

我的猜测是您希望用户这样做。如果是这样,请尝试这个 where 子句:

where not exists (select *
                  from documents d2
                  where d2.creationtime >= Dateadd(day, -90, getutcdate()) and
                        d2.OwnerId = users.handle
                 )

关于SQL "Where Not Exists"未返回任何行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16450849/

相关文章:

mysql - 使用 INNER JOIN 和 WHERE 的 SQL 查询

php - Sql 多链表

sql-server - 无法将行从一个数据库复制到 SQL Server 上不同服务器上的另一个数据库

sql-server - 从openjson SQL Server 2016中的嵌套数组中删除对象

sql - 在 where 子句中使用 select max() 函数改进 SQL 查询

sql - 使用联接和匹配特定列执行 SQL 更新

c# - 如何将一个列表分成两个可以容纳奇数个计数的列表?

mysql - 如何以更优化的方式从数据库中获取随机行

sql - 使用 SQLite 从另一列更新一列?

sql-server - 在使用表达式 SSRS 使用两个数据集进行计算时需要帮助