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 的意义所在。