【问题标题】:subquery aggregation issue子查询聚合问题
【发布时间】:2018-12-18 20:15:43
【问题描述】:

以下查询有问题:

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 子句中,除非它位于 包含在 HAVING 子句或选择列表中的子查询,以及列 被聚合是一个外部引用。

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

【问题讨论】:

  • 你想在这里做什么?为什么你会在 datediff 中有 Max(dob)?
  • 该错误消息的哪一部分不清楚? where 子句中不能有聚合。提示...MAX。
  • 更新您的问题添加适当的数据样本和预期结果
  • 已编辑。请找到。
  • 对不起,你的问题没有任何意义。我认为您需要发布示例数据和期望的结果以使其清楚。

标签: sql sql-server


【解决方案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 子句(或 MIN、SUM 等)中的 MAX 是不允许的,除非在特定的、狭义的情况下。如果在 WHERE 子句中需要 MAX() 值,则必须在其他地方计算。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2021-07-03
    • 2020-05-15
    • 2017-12-15
    相关资源
    最近更新 更多