对以下查询有问题:
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
错误消息:
除非聚合位于HAVING子句或select列表包含的子查询中,并且被聚合的列是外部引用,否则聚合不能出现在WHERE子句中。
基于变更数据捕获,尝试从当前最大日期(目标)中选择1小时的记录(源),该日期(目标)位于纪元日期时间(将日期时间转换为纪元)。外部查询将是源,内部查询将是目标,请帮助我。谢谢
发布于 2018-12-19 05:03:19
重新考虑您的查询。您有一个来自外部源的计算值和一个来自内部源的计算值。您正在使用不带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子句(或MIN、SUM等)中的- MAX是不允许的,除非是在特定的、狭义定义的情况下。如果在WHERE子句中需要MAX()值,则必须在其他地方计算它。
https://stackoverflow.com/questions/53840399
复制相似问题