2017-11-27 11 views
0

보고서 작성기의 하위 쿼리가 둘 이상의 행을 반환하는 이유를 파악하기가 쉽지 않습니다. SQL Server/Report Builder 하위 쿼리에서 둘 이상의 행 오류를 반환합니다.

(
    SELECT 
    (
     CASE 
      WHEN C.CourseCode IN ('50089079','50089080') THEN 'L2 Maths FS' 
      WHEN C.CourseCode IN ('50089067','50089109') THEN 'L1 Maths FS' 
      WHEN C.CourseCode IN ('50084987','50092959') THEN 'E3 Maths FS' 
      WHEN C.CourseCode IN ('50084975','50091967') THEN 'E2 Maths FS' 
      WHEN C.CourseCode IN ('50084963','50091724') THEN 'E1 Maths FS' 
      WHEN C.CourseCode IN ('60146084') THEN 'GCSE Maths' 
      Else 'NA' 
     END 
    ) 
    FROM 
     Enrolment E 
    INNER JOIN 
     Course C ON C.CourseID = E.CourseID 
    WHERE 
     E.PMStudentID = vReports_Enrolment.PMStudentID 
     AND C.CourseCode IN ('50089079', '50089080', '50089067', '50089109', '50084987', '50092959', '50084975', '50091967', '50084963', '50091724', '60146084') 
     AND vReports_Enrolment.CompletionID = 1 
) 

이 오류가 팝업되는 특정 학습자에 대한 데이터입니다 - 일반적으로 2 개 행이 CompletionID이가 '1'것 있는지 확인하고 그렇지 않으면 반환이있을 것이다 어디 강조했습니다

CourseCode CompletionID 
------------------------- 
50044357 1 
50044369 1 
50089079 0 
60146084 1 
60187578 1 
60148366 1 

이 경우 예상되는 동작은 'GCSE 수학'을 반환하는 것입니다. 제가 잘못 했나요?

+0

게시 한 현재 출력이 위에있는 쿼리와 직접 일치하지 않습니다. 질문을 수정할 수 있습니까? 오류에 관해서는, 그것은 꽤 자명합니다. 하나 이상의 레코드/값을 반환하는 select 절에 하위 쿼리가 있는데 의미가 없습니다. –

+0

전체적인 쿼리가 방대하며이 부분 만 넘어갑니다. CourseCode가 지정된 범위에 있고 CompletionID가 1 인 경우 정확하게 1 값을 반환한다고 CASE를 기반으로합니다. –

+0

_entire_ 쿼리를 확인해야합니다. 예 select 절에있는 하나의'CASE' 표현식이이 오류를 일으키지 않아야합니다. 이것이이 문제가 아닌 이유입니다. –

답변

0

추가 :

(
    SELECT TOP 1 
    (
     CASE 

는 하나의 행이 반환됩니다 확인, 예상되는 동작입니다.

1

경우에 따라 행이 2 행 이상일 수 있습니다.

TOP 1을 사용하면 원하는 데이터가 보장되지 않을 수 있습니다. 특히 데이터가 사용자가 생각한만큼 깨끗하지 않은 경우에는 특히 그렇습니다.

SELECT DISTINCT ...을 사용하는 것이 더 안전합니다. 이렇게하면 반환 된 행이 모두 동일하고 중복 된 경우 올바른 답을 얻을 수 있습니다. 그래도 오류가 발생하면 하위 쿼리 결과를 조사해야합니다.