我对以下查询有疑问。我可以在查询下运行,因为它是
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作为其中一个列,但不确定它为什么会失败。 有什么指针吗?
答案 0 :(得分:0)
EXISTS
仅检查是否会返回数据集,因此您使用SELECT *
而不使用GROUP BY
的事实并不重要(因为SELECT
不是不评估。由于缺少EXISTS
并且您尝试使用GROUP BY
,SELECT *
之外的查询语法无效。
答案 1 :(得分:0)
SELECT *
子查询中的EXISTS()
实际上并不代表所有列。您只是在寻找行的存在。
同样,您可以使用SELECT 1
或SELECT 12848123
,它的工作方式也相同。
SQL Server非常聪明,可以推断GROUP
行如何在未明确告知HAVING
的情况下遵守EXISTS()
条款,因为您实际上并没有返回结果集。
但是,如果您尝试在EXISTS()
之外运行相同的查询,则SELECT *
现在意味着SELECT all columns
,您需要明确SELECT
和{{1按常规列。