5

这是我要完成的工作: 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 语句没有一个牢固的理解。我非常感谢您的帮助。

4

5 回答 5

10

原因是您的子查询不相关。因此,该where条款是说:在创建时间大于 90 天的文档中不存在任何记录。有这样的记录,所以where子句总是失败。

我的猜测是你想要这个用户。如果是这样,那么试试这个where子句:

where not exists (select *
                  from documents d2
                  where d2.creationtime >= Dateadd(day, -90, getutcdate()) and
                        d2.OwnerId = users.handle
                 )
于 2013-05-08T21:57:22.917 回答
3

一种方法是将Documents放在子查询中,将其从外部查询中删除,从而使子查询成为相关的:

SELECT Users.UserID 
FROM Users 
WHERE NOT EXISTS
    (
    SELECT * 
    FROM Documents
    WHERE Documents.OwnerID = Users.handle
      AND Documents.creationtime >= Dateadd(day, -90, getutcdate())
    ) ;

这样,您也可以免费摆脱GROUP BY

于 2013-05-08T22:01:58.857 回答
3

在不使用子查询的情况下获得相同结果的捷径是使用左连接并检查 Documents 表中的 NULL,如下所示:

SELECT Users.UserID
FROM Users  
LEFT JOIN Documents on documents.OwnerID = users.handle
    AND documents.creationtime >= Dateadd(day, -90, getutcdate())
WHERE Documents.OwnerID IS NULL
ORDER BY Users.UserID ASC
于 2013-05-08T22:03:54.053 回答
2

如果您的 NOT EXISTS 中的查询返回 ANY 行,您将返回 0 行。您是在说“如果此查询不返回任何内容,请将行还给我”

编辑:是的,戈登在下面有正确的想法。你想说“如果这个查询没有为这个用户返回任何内容,请给我这个用​​户的行”

编辑2:下面我的意思是上面:)

于 2013-05-08T21:57:07.827 回答
0

如果表对于更高版本的 SQL Server 来说不是太大,另一种选择是使用“except”

SELECT Users.UserID FROM Documents INNER JOIN Users ON documents.OwnerID = users.handle WHERE documents.creationtime >= Dateadd(day, - 90, getutcdate()) GROUP BY Users.UserID

除了

( SELECT * FROM Documents WHERE documents.creationtime >= Dateadd(day, - 90, getutcdate()) ) 按 Users.UserID ASC 排序

于 2018-03-20T12:36:11.340 回答