以下查询存在问题:
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转换为纪元)。外部查询是源,内部查询是目标 请帮我。 谢谢
答案 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()值,则必须在其他地方计算该值。