SQL 子查询问题 - 对象名称无效

SQL Subquery issue - Invalid object name

提问人:San 提问时间:6/8/2023 最后编辑:Thorsten KettnerSan 更新时间:6/8/2023 访问量:121

问:

我准备了下面的“子查询”代码。错误消息:“显示无效的对象名称'group1-2'”。我可以知道如何解决这个问题。

select
  CASE
    WHEN reference_s = 'R1' THEN
      (select sum(DATEDIFF(second, datetime2_s,datetime6_s) ) from group1_2)
    WHEN reference_s = 'R2' THEN
      (select sum(DATEDIFF(second, datetime3_s,datetime6_s) ) from group1_2)
  END
  / (CAST(count(*) AS float)*60)
from
(
  select * from
  (
    select
      id,
      min(reference) as reference_s, min(datetime2) as datetime2_s,
      min(datetime3) as datetime3_s, max(datetime6) as datetime6_s,
      count(*) as type_s, sum(size) as size_s
    from dbo.testing
    group by id
  ) group1
  where type_s=2 and cntr_size_s=44
  UNION
  select * from
  (
    select
      id,
      min(reference) as reference_s, min(datetime2) as datetime2_s,
      min(datetime3) as datetime3_s, max(datetime6) as datetime6_s,
      count(*) as type_s, sum(size) as size_s
    from dbo.testing
    group by id
  ) group2
  where type_s=1
) group1_2
where datetime6_s IS NOT null
and datetime6_s >= '2023-03-01 00:00'
and datetime6_s <= '2023-03-30 23:59'
t-sql 嵌套 子查询 语法错误

评论

0赞 Adrian Maxwell 6/8/2023
不知道;因为您没有提供完整的错误消息。使用完整的消息编辑您的问题 - 复制并粘贴为文本 - 不要使用图像。标签下方有一个编辑链接 - 使用它。
2赞 Adrian Maxwell 6/8/2023
而不是这个:使用这个:“datetime”值比 1 分钟更精确 - 但也许你也意味着(整个三月)datetime6_s >= '2023-03-01 00:00' AND datetime6_s <= '2023-03-30 23:59'datetime6_s >= '20230301' AND datetime6_s < '20230331' datetime6_s >= '20230301' AND datetime6_s < '20230401'
0赞 DrDoomPDX 6/8/2023
生成表 var 并在其中插入一些虚拟测试数据也可能是一个好主意,以便有人可以将其粘贴到其 SSMS 中并对其进行调试。
0赞 Thorsten Kettner 6/8/2023
请参阅我的答案以获取解释。您收到错误,因为您为了多次访问数据集而使用子句。也尝试修复其他错误。如果无法实现此操作,请使用修改后的查询创建一个新请求,描述查询的确切操作。然后添加示例数据和预期结果,以便我们了解您想要的结果。不要更改此请求,因为它已正确询问和回答。如果您遇到新查询,请使用新问题提出新请求。WITHgroup1_2
1赞 Thorsten Kettner 6/8/2023
旁注:是一个奇怪的伯爵名字。 是多余的。我也会按照 Pauls 的建议写日期范围条件。type_swhere datetime6_s is not null

答:

0赞 Thorsten Kettner 6/8/2023 #1

在子句中,您有一个子查询,其结果调用 。在您的子句中,您有子查询从中进行选择。这在 SQL 中是不允许的,因为在子句中,您查看表中的单个行(或表的聚合行)。该子句不知道整个表。如果要定义可在查询中多次访问的临时视图,则必须将其设为 CTE(又名子句)。FROMgroup1_2SELECTSELECTSELECTWITH

但是您的查询中还有更多缺陷:

  • 你有 ,但你没有选择任何 。from (...) group1 where ... cntr_size_s = 44cntr_size_sgroup1
  • 你有 ,但你没有选择任何 。from (...) group2 where ... cntr_size_s = 44cntr_size_sgroup2
  • 你有。因此,您可以访问列和聚合结果。但是没有 ,它会给你一个聚合结果。那么,您在此处访问的数据如何聚合到单个行 () 而不是同时聚合 ()呢?这是不可能的。 可以在语法上解决这个问题,但我不知道这是否是您正在寻找的解决方案。select case when reference_s = 'R1' ...end ... / cast(count(*) ...)group1_2GROUP BY reference_sreference_sCOUNT(*)reference_sGROUP BY reference_s
0赞 gskarthikkn 6/8/2023 #2

在 SELECT 部件中不允许使用从派生表中使用的子查询。 除此之外,您的查询中还有一些逻辑问题 如果您希望查询运行没有任何问题,请尝试以下操作

select
  CASE
    WHEN reference_s = 'R1' THEN
      sum(DATEDIFF(second, datetime2_s,datetime6_s))
    WHEN reference_s = 'R2' THEN
      sum(DATEDIFF(second, datetime3_s,datetime6_s) )
  END
  / (CAST(count(*) AS float)*60)
from
(
  select * from
  (
    select
      id,
      min(reference) as reference_s, min(datetime2) as datetime2_s,
      min(datetime3) as datetime3_s, max(datetime6) as datetime6_s,
      count(*) as type_s, sum(size) as size_s
    from dbo.testing
    group by id
  ) group1
  where type_s=2 and cntr_size_s=44
  UNION
  select * from
  (
    select
      id,
      min(reference) as reference_s, min(datetime2) as datetime2_s,
      min(datetime3) as datetime3_s, max(datetime6) as datetime6_s,
      count(*) as type_s, sum(size) as size_s
    from dbo.testing
    group by id
  ) group2
  where type_s=1
) group1_2
where datetime6_s IS NOT null
and datetime6_s >= '2023-03-01 00:00'
and datetime6_s <= '2023-03-30 23:59'
GROUP BY id,reference_s

评论

0赞 San 6/8/2023
谢谢。我已经尝试了您修改后的代码,但没有发现任何问题。但是,我无法得到我想要的结果。事实上,我之前已经准备好了如下的sql...SUM( 当 reference_s = 'R1' 时的情况 THEN DATEDIFF(第二, datetime2_s,datetime6_s) 当 reference_s='R2' 时 THEN DATEDIFF(第二, datetime3_s,datetime6_s) 结束) /(CAST(count(*) AS float)*60) ....但是,我不想使用嵌套聚合函数。所以我尝试使用子查询。
0赞 Thorsten Kettner 6/8/2023
@San:正如我在请求评论中提到的:您询问了错误“无效的对象名称'group1-2'”,并且已经回答了这个问题。我什至指出了您查询中的其他缺陷。有了这些知识,你就可以继续处理你的查询了。很明显,您不想使用上面的查询,因为按 id 聚合意味着根本不聚合。因此,请考虑您想要实现的目标并修改您的查询。如果遇到困难,请打开一个新请求,其中包含示例数据和预期结果。