子查询聚合问题

时间:2018-12-18 20:15:44

标签: sql sql-server

以下查询存在问题:

SELECT * 
FROM   [projectuser].[dbo].[newdataset] 
WHERE  ( Datediff(s, '1970-01-01 00:00:00', Max(dob)) ) 
       >= 
       (SELECT Datediff(s, '1970-01-01 00:00:00', Max(dob)) - 3600 
        FROM [projectuser].[dbo].[sqlquries7]) 
ORDER  BY dob 

错误消息:

  

除非聚集在WHERE子句中,否则它可能不会出现在WHERE子句中   HAVING子句或选择列表中包含的子查询,以及该列   被汇总是外部参考。

基于更改数据捕获,尝试从当前最大日期(目标)中选择以纪元日期时间为单位的1小时记录(源)(将datetime转换为纪元)。外部查询是源,内部查询是目标 请帮我。 谢谢

1 个答案:

答案 0 :(得分:1)

重新考虑您的查询。您从外部来源获得一个计算值,而从内部来源获得一个计算值。您正在使用没有GROUP BY的MAX,表示要比较每个表中的单个值。如果值Datediff(s, '1970-01-01 00:00:00', Max(dob))大于(SELECT Datediff(s, '1970-01-01 00:00:00', Max(dob)) - 3600 FROM [projectuser].[dbo].[sqlquries7])返回的值,则将返回[projectuser].[dbo].[newdataset]中的所有行。

也就是说,如果您现有的逻辑有效。

因此,首先要做的就是定义您实际要寻找的东西。这应该包括您要查找的行(即newDataSet中的所有行,其中dob位于根据sqlqueries表计算出的值之后。

请注意,使用sqlqueries表中的单个值的方法是(1)将结果放入变量中,例如:

DECLARE @mdob datetime
SELECT @mdob = Datediff(s, '1970-01-01 00:00:00', Max(dob)) - 3600 
        FROM [projectuser].[dbo].[sqlquries7]

或者使用单个值创建一个派生表,并将其交叉联接到另一个记录集,例如:

SELECT * 
FROM   [projectuser].[dbo].[newdataset] nds
CROSS JOIN (
    SELECT Datediff(s, '1970-01-01 00:00:00', Max(dob)) - 3600 AS Cutoff
    FROM [projectuser].[dbo].[sqlquries7]) as Tbl
WHERE  ( Datediff(s, '1970-01-01 00:00:00', dob) ) >= Cutoff

但是请记住-除非在特定的狭窄定义的情况下,否则WHERE子句中的MAX(或MIN,SUM等)是不允许的。如果您的WHERE子句中需要一个MAX()值,则必须在其他地方计算该值。