提问人:San 提问时间:6/8/2023 最后编辑:Thorsten KettnerSan 更新时间:6/8/2023 访问量:121
SQL 子查询问题 - 对象名称无效
SQL Subquery issue - Invalid object name
问:
我准备了下面的“子查询”代码。错误消息:“显示无效的对象名称'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'
答:
0赞
Thorsten Kettner
6/8/2023
#1
在子句中,您有一个子查询,其结果调用 。在您的子句中,您有子查询从中进行选择。这在 SQL 中是不允许的,因为在子句中,您查看表中的单个行(或表的聚合行)。该子句不知道整个表。如果要定义可在查询中多次访问的临时视图,则必须将其设为 CTE(又名子句)。FROM
group1_2
SELECT
SELECT
SELECT
WITH
但是您的查询中还有更多缺陷:
- 你有 ,但你没有选择任何 。
from (...) group1 where ... cntr_size_s = 44
cntr_size_s
group1
- 你有 ,但你没有选择任何 。
from (...) group2 where ... cntr_size_s = 44
cntr_size_s
group2
- 你有。因此,您可以访问列和聚合结果。但是没有 ,它会给你一个聚合结果。那么,您在此处访问的数据如何聚合到单个行 () 而不是同时聚合 ()呢?这是不可能的。 可以在语法上解决这个问题,但我不知道这是否是您正在寻找的解决方案。
select case when reference_s = 'R1' ...end ... / cast(count(*) ...)
group1_2
GROUP BY reference_s
reference_s
COUNT(*)
reference_s
GROUP 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 聚合意味着根本不聚合。因此,请考虑您想要实现的目标并修改您的查询。如果遇到困难,请打开一个新请求,其中包含示例数据和预期结果。
评论
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'
WITH
group1_2
type_s
where datetime6_s is not null