EXISTS中的查询不起作用,但是对于Exists,它可以正常工作

时间:2017-12-18 19:12:40

标签: sql-server

我对以下查询有疑问。我可以在查询下运行,因为它是

IF EXISTS (SELECT * FROM DRS_MessageActivity HAVING DATEDIFF(MINUTE, MAX(ISNULL(DataMessageHeartbeatTime, 0)), GETUTCDATE()) >= 5) 
BEGIN 
    print 'worked';
END

...并打印“工作”,但当我检查内部查询时,

SELECT * FROM DRS_MessageActivity HAVING DATEDIFF(MINUTE, MAX(ISNULL(DataMessageHeartbeatTime, 0)), GETUTCDATE()) >= 5

...它失败并显示错误“列'DRS_MessageActivity.ReplicationID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”

有趣的是,它没有给出我的任何语法错误,但它失败了

我的研究:以下所有作品

- Just MAX

select MAX(DataMessageHeartbeatTime) FROM DRS_MessageActivity

- 只是ISNULL

SELECT ISNULL(DataMessageHeartbeatTime, 0) FROM DRS_MessageActivity

- 只是Max + ISNULL

select MAX(ISNULL(DataMessageHeartbeatTime, 0)) FROM DRS_MessageActivity

- Just DATEDIFF(interval,date1,date2)

select DATEDIFF(MINUTE, MAX(ISNULL(DataMessageHeartbeatTime, 0)), GETUTCDATE())  FROM DRS_MessageActivity

我将ReplicationID作为其中一个列,但不确定它为什么会失败。 有什么指针吗?

2 个答案:

答案 0 :(得分:0)

EXISTS仅检查是否会返回数据集,因此您使用SELECT *而不使用GROUP BY的事实并不重要(因为SELECT不是不评估。由于缺少EXISTS并且您尝试使用GROUP BYSELECT *之外的查询语法无效。

答案 1 :(得分:0)

SELECT *子查询中的EXISTS()实际上并不代表所有列。您只是在寻找行的存在。

同样,您可以使用SELECT 1SELECT 12848123,它的工作方式也相同。

SQL Server非常聪明,可以推断GROUP行如何在未明确告知HAVING的情况下遵守EXISTS()条款,因为您实际上并没有返回结果集。

但是,如果您尝试在EXISTS()之外运行相同的查询,则SELECT *现在意味着SELECT all columns,您需要明确SELECT和{{1按常规列。