【问题标题】:Nested subquery in Access alias causing "enter parameter value"Access 别名中的嵌套子查询导致“输入参数值”
【发布时间】:2015-01-24 02:18:12
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: sql ms-access correlated-subquery


    【解决方案1】:

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

    【讨论】:

    • 非常好,是的,效果很好。巧妙地使用 where 降低级别,然后稍后分组。谢谢
    【解决方案2】:

    您的子查询只能看到其上一层。所以 Night.NightId 对它来说是完全未知的,因此为什么会提示您输入一个值。您可以使用 Group By 来获取每个 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

    【讨论】:

    • 也许我的列名TopTwoMarkedAsDoubles 可以更好地命名为“HowManyOfHighestScoresWereAlsoDoubles”(很长——但你明白了),这就是为什么需要顶部的原因。您的答案将所有晚上都列为有 2 个双打,这是不正确的。子查询上的连接也应该是 S.NightId = N.NightId
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多