Sql server EXISTS中的查询不起作用,但EXISTS中的查询起作用

Sql server EXISTS中的查询不起作用,但EXISTS中的查询起作用,sql-server,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 HAV

我对下面的问题有疑问。我能够运行下面的查询,因为它是

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子句中

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

我的研究:下面是所有的作品

-只有MAX

select MAX(DataMessageHeartbeatTime) FROM DRS_MessageActivity
-就是空的

SELECT ISNULL(DataMessageHeartbeatTime, 0) FROM DRS_MessageActivity
-仅Max+ISNULL

select MAX(ISNULL(DataMessageHeartbeatTime, 0)) FROM DRS_MessageActivity
-只是DATEDIFFinterval,date1,date2

select DATEDIFF(MINUTE, MAX(ISNULL(DataMessageHeartbeatTime, 0)), GETUTCDATE())  FROM DRS_MessageActivity
我将ReplicationID作为列之一,但不确定它失败的原因。。 任何指针?

只会检查是否会返回数据集,因此您使用了SELECT*和NOGROUP BY这一事实实际上并不重要,因为SELECT不可计算。EXISTS之外的查询语法无效,因为缺少GROUP BY,并且您正在尝试使用SELECT*

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

同样,您可以使用SELECT 1或SELECT 12848123,其工作方式也相同

SQL Server非常聪明,可以推断如何将行分组以遵守EXISTS中的HAVING子句,而无需显式被告知,因为您实际上并没有返回结果集


但是,如果您试图在EXISTS之外运行相同的查询,SELECT*now意味着选择所有列,并且您需要按照通常的列显式地选择和分组。

您能详细说明返回数据集的含义吗?不知道我还能如何详细说明,它非常简洁。如果数据集将从EXISTS…Awesome.中的查询返回。。这就是对我有意义的解释。。谢谢@Aaron。