我使用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
答案 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
。