2015-01-24 1 views
0

작은 작업에 대해 Access (일반적으로 SQL Server 사용)를 사용 중이며 아래 문에 Night.NightId에 대한 "매개 변수 값 입력"이 표시됩니다. 하위 쿼리 내 하위 쿼리 두 단계 깊이 중첩하지 않으면 효과가있을 것으로 기대하지만, 그 방법을 생각할 수는 없습니다 (쿼리 아이디어 환영)."매개 변수 값 입력"을 유발하는 액세스 별칭의 중첩 된 하위 쿼리

시나리오는 매우 간단합니다. 테이블은 Score 테이블과 일대 다 관계에있는 Night 테이블이 있습니다. 매일 밤마다 점수가 10 점이됩니다. 각 점수에는 두 개의 점수에 대해 일반적으로 true 인 비트 필드 IsDouble이 있습니다.

모든 밤을 나열하려면 각 옆에 숫자가 표시되어 상위 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

이 추측 비트입니다. 그러나 일부 데이터베이스는 다중 중첩 된 하위 쿼리에서 상관 조건에 문제가 있습니다. MS Access에이 문제가있을 수 있습니다. 그것은 단순히 문제 추가를 얻기 위해 다시 Night에 가입하는 것입니다,이 작동하는 경우

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; 

:

그렇다면, 당신은 상단 두 값을 고른다 where 절 집계를 사용하여이 문제를 해결할 수 열.

+0

훌륭함, 훌륭하게 작동합니다. 영리를 통해 레벨을 줄이면 나중에 어디에서 그룹으로 나갈 수 있습니다. 감사합니다 –

1

하위 쿼리는 상위 한 수준 만 볼 수 있습니다. 그래서 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을 사용하고 볼 수 없습니다 때문입니다.

+0

어쩌면 내 컬럼 이름'TopTwoMarkedAsDoubles'는'HowManyOfHighestScoresWereAlsoDoubles '(오랫동안 아이디어를 얻었습니다.)라는 이름을 붙일 수 있습니다. 귀하의 답변은 모든 밤에 2 개의 복식이 올바르지 않은 것으로 표시합니다. 또한 하위 쿼리에 대한 조인은 S.NightId = N.NightId 여야합니다. –

관련 문제