2011-07-27 2 views
2

하나의 열에 위치 번호 (1 - 6)에 연결된 여러 값을 반환하려고하지만 각각의 경우 특정 위치에있는 값만 반환하려고합니다. 기본적으로 각 열에 대해 하나씩 6 개의 열을 만들고 해당 위치 번호와 관련된 모든 결과 값을 반환합니다.여러 값을 CASE 내에서 중첩 된 SELECT에서 반환

(CASE WHEN tbl_TestWells.well_result <> NULL 
THEN 
(SELECT tbl_TestWells.well_result 
FROM tbl_TestWells 
WHERE tbl_TestWells.Well_Index = 1) 
ELSE NULL END) AS Well_1_Graded_Result, 

문제는 그들은 단지 그것을가 설정되어 방식으로 NULL 값을 반환한다는 것입니다 : 나는이 결과를 얻기 위해 시도하는 6 중첩 된 사례 문을 만들었습니다. 이 케이스를 꺼내면 오류 메시지 "subquery가 두 개 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 다음과 같이 사용될 때 허용되지 않습니다. 표현."

편집 : 전체 코드는보기가 그래서

SELECT DISTINCT 
--Other Columns being selected 

(CASE WHEN tbl_TestWells.well_result <> NULL 
THEN 
(SELECT tbl_TestWells.well_result 
FROM tbl_TestWells 
WHERE tbl_TestWells.Well_Index = 1) 
ELSE NULL END) AS Well_1_Graded_Result, 

--The other five well results are set up in the exact same format as above, just replacing 1 with the corresponding number 

FROM tbl_TestCartridges 

JOIN tbl_Tests ON 
tbl_Tests.test_uid = tbl_TestCartridges.test_uid 

JOIN tbl_Programs ON 
tbl_Programs.program_uid = tbl_Tests.program_uid 

JOIN tbl_Cartridges ON 
tbl_Cartridges.system_uid = tbl_Programs.system_uid 

JOIN tbl_TestWells ON 
tbl_TestWells.test_cartridge_uid = tbl_TestCartridges.test_cartridge_uid 

JOIN tbl_TestSamples ON 
tbl_TestSamples.test_well_uid = tbl_TestWells.test_well_uid 

ORDER BY tbl_TestCartridges.barcode 

; 
+2

특별히주의하는 것이 도움이 될 수있는 ISNULL/IFNULL 이후 사용중인 SQL (T-SQL, MySQL은, PL/SQL) 어떤 변형, 기능은 그들 사이에 다양합니다. –

답변

1

경우 문을 하나의 행의 장소에 표시 6 개 행을 야기 할 수 없습니다 적절한 무엇으로 단순화 한 부분이다. CASE 문이 아닌 쿼리의 JOIN에 "1 또는 여러 행"논리를 작성해야합니다.

전체 쿼리 및 스키마와 달성하려는 것에 대한 설명을 포함하십시오.

+0

필요한 경우 나머지 코드를 표시하도록 편집되었습니다. 내가 이루고자하는 것은 뷰에서 6 개의 컬럼을 얻는 것인데, 6 개의 웰 포지션 각각에 대해 하나씩, 잘 연결된 결과와 관련이있다. 웰 위치 번호와 결과는 모두 Tbl_TestWell에서 찾을 수 있습니다. 예를 들어 Well_1_Graded_Results 열에서 TestWell 테이블에서 Well_index가 1 인 모든 결과를 검색하려고합니다. 그게 더 명확한가요? – Jon

0

NULL 값을 확인할 때 논리 연산자를 사용할 수 없습니다. NULL은 알 수 없으므로 1 = NULL입니까? 아니요. 1 <> NULL입니까? 아니오, 왜냐하면 NULL 일 수 있기 때문에이 경우 1 일 것입니다 - 우리는 알지 못합니다.

대신 NULL 확인 및 비교를 수행하려면 IS NULLIS NOT NULL을 사용해야합니다.

이 다음과 같아야 :

(CASE WHEN tbl_TestWells.well_result IS NOT NULL THEN ...

0

을 당신이 tbl_TestWells.Well_Index = 1, 2, 3...와 함께 몇 가지 (6) 행이 추측하고 한 행에서 이러한 결과를 수집하고 싶어?

그래, 당신이 뭔가를해야하는 경우 :

SELECT 
    MIN(CASE WHEN tbl_TestWells.well_result IS NOT NULL 
        AND tbl_TestWells.Well_Index = 1 
       THEN tbl_TestWells.well_result 
     END 
     ) AS Well_1_Graded_Result 
    , MIN(CASE WHEN tbl_TestWells.well_result IS NOT NULL 
        AND tbl_TestWells.Well_Index = 2 
       THEN tbl_TestWells.well_result 
     END 
     ) AS Well_2_Graded_Result 
    , ... 
FROM 
    ... 
GROUP BY 
     ?       --- what do these (6) rows have in common? 
ORDER BY 
     tbl_TestCartridges.barcode 
관련 문제