首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >子查询聚合问题

子查询聚合问题
EN

Stack Overflow用户
提问于 2018-12-19 04:15:44
回答 1查看 47关注 0票数 0

对以下查询有问题:

代码语言:javascript
复制
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小时的记录(源),该日期(目标)位于纪元日期时间(将日期时间转换为纪元)。外部查询将是源,内部查询将是目标,请帮助我。谢谢

EN

回答 1

Stack Overflow用户

发布于 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]中的所有行。

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

因此,你需要做的第一件事就是定义你真正想要的是什么。这应该包括您正在查找的行(即newDataSetdob位于从sqlqueries表计算出的值之后的所有行)。

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

代码语言:javascript
复制
DECLARE @mdob datetime
SELECT @mdob = Datediff(s, '1970-01-01 00:00:00', Max(dob)) - 3600 
        FROM [projectuser].[dbo].[sqlquries7]

或者创建具有单个值的派生表,并将其交叉联接到其他记录集,例如:

代码语言:javascript
复制
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()值,则必须在其他地方计算它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53840399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档