Access 别名中的嵌套子查询导致 "enter parameter value"
Nested subquery in Access alias causing "enter parameter value"
我正在使用 Access(我通常使用 SQL 服务器)做一些小工作,我在下面的语句中得到 "enter parameter value" for Night.NightId
有一个子查询在子查询中。我希望如果我不将它嵌套两层深它会起作用,但我想不出解决它的方法(欢迎查询想法)。
场景非常简单,有一个 Night
table 与 Score
table 一对多关系 - 每个晚上通常有 10 个分数.每个分数都有一个位字段 IsDouble
,其中两个分数通常是 true
。
我想列出所有的夜晚,每个夜晚旁边都有一个数字,代表前 2 名中有多少人被标记为 IsDouble
(可能是 0、1 或 2)。
这是 SQL,我尝试了很多向列和 table 添加别名的组合,但为了简单起见,我在下面将它们去掉了:
select Night.*
,
( select sum(IIF(IsDouble,1,0)) from
(SELECT top 2 * from Score where NightId=Night.NightId order by Score desc, IsDouble asc, ID)
) as TopTwoMarkedAsDoubles
from Night
这有点猜测。但是,某些数据库在多重嵌套子查询中存在关联条件问题。 MS Access 可能有这个问题。
如果是这样,您可以通过使用带有选择前两个值的 where
子句的聚合来解决此问题:
select s.nightid,
sum(IIF(IsDouble, 1, 0)) as TopTwoMarkedAsDoubles
from Score as s
where s.id in (select top 2 s2.id
from score as s2
where s2.nightid = s.nightid
order by s2.score desc, s2.IsDouble asc, s2.id
)
group by s.nightid;
如果这可行,只需简单地加入 Night
即可获得额外的列。
您的子查询只能看到其上一级。所以 Night.NightId 是完全未知的,因此系统会提示您输入一个值。您可以使用分组依据为每个 NightId 获取所需的值,然后将其关联回原始 Night table.
Select *
From Night
left join (
Select N.NightId
, sum(IIF(S.IsDouble,1,0)) as [Number of Doubles]
from Night N
inner join Score S
on S.NightId = S.NightId
group by N.NightId) NightsWithScores
on Night.NightId = NightsWithScores.NightId
因为 IIF(S.IsDouble,1,0)
我不明白使用 top
的意义所在。
我正在使用 Access(我通常使用 SQL 服务器)做一些小工作,我在下面的语句中得到 "enter parameter value" for Night.NightId
有一个子查询在子查询中。我希望如果我不将它嵌套两层深它会起作用,但我想不出解决它的方法(欢迎查询想法)。
场景非常简单,有一个 Night
table 与 Score
table 一对多关系 - 每个晚上通常有 10 个分数.每个分数都有一个位字段 IsDouble
,其中两个分数通常是 true
。
我想列出所有的夜晚,每个夜晚旁边都有一个数字,代表前 2 名中有多少人被标记为 IsDouble
(可能是 0、1 或 2)。
这是 SQL,我尝试了很多向列和 table 添加别名的组合,但为了简单起见,我在下面将它们去掉了:
select Night.*
,
( select sum(IIF(IsDouble,1,0)) from
(SELECT top 2 * from Score where NightId=Night.NightId order by Score desc, IsDouble asc, ID)
) as TopTwoMarkedAsDoubles
from Night
这有点猜测。但是,某些数据库在多重嵌套子查询中存在关联条件问题。 MS Access 可能有这个问题。
如果是这样,您可以通过使用带有选择前两个值的 where
子句的聚合来解决此问题:
select s.nightid,
sum(IIF(IsDouble, 1, 0)) as TopTwoMarkedAsDoubles
from Score as s
where s.id in (select top 2 s2.id
from score as s2
where s2.nightid = s.nightid
order by s2.score desc, s2.IsDouble asc, s2.id
)
group by s.nightid;
如果这可行,只需简单地加入 Night
即可获得额外的列。
您的子查询只能看到其上一级。所以 Night.NightId 是完全未知的,因此系统会提示您输入一个值。您可以使用分组依据为每个 NightId 获取所需的值,然后将其关联回原始 Night table.
Select *
From Night
left join (
Select N.NightId
, sum(IIF(S.IsDouble,1,0)) as [Number of Doubles]
from Night N
inner join Score S
on S.NightId = S.NightId
group by N.NightId) NightsWithScores
on Night.NightId = NightsWithScores.NightId
因为 IIF(S.IsDouble,1,0)
我不明白使用 top
的意义所在。