Access别名中的嵌套子查询导致“输入参数值”

时间:2015-01-24 02:18:13

标签: sql ms-access correlated-subquery

我使用Access(我通常使用SQL Server)做一点工作,而且我得到"输入参数值"对于下面的语句中的Night.NightId,在子查询中有一个子查询。我希望如果我没有将它嵌套两层深,它会起作用,但我不能想到解决它的方法(欢迎查询提示)。

场景非常简单,Night表格与Score表格有一对多的关系 - 每晚通常有10个分数。每个分数都有一个位IsDouble,对于其中两个分数通常为true

我想列出所有的夜晚,每个晚上都有一个数字,表示前2个分数中有多少被标记为IsDouble(将是0,1或2)。

这是SQL,我尝试了很多将列和表添加别名的组合,但为了简单起见,我已将它们删除:

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

2 个答案:

答案 0 :(得分:3)

这是一种猜测。但是,某些数据库在多重嵌套子查询中存在关联条件问题。 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即可获取其他列。

答案 1 :(得分:1)

您的子查询只能看到它上面的一个级别。所以Night.NightId完全不为人知,因此提示您输入值。您可以使用分组依据获取每个NightId所需的值,然后将其关联回原始的Night表。

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