2023.04.06(PJ401 중복된 행 찾기)

SaGo_MunGcci·2023년 4월 6일
0

업무 프로젝트

목록 보기
25/29

서브쿼리중 하나가 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.라고 오류가 발생함

서브쿼리가 많은데 어떤게 중복된건지 감을 못잡음

과장님께서 가르쳐주시면서 찾았던 방법

자세히 보니 서브쿼리중 중복된 쿼리가 있었다. 이쿼리를 묶어서 WHERE절에 추가하고 추가된 쿼리의 테이블을 추가함. 주석참고

그랬더니 혈청크레아티닌이라는 값이 2개행이 나옴.

그래서 아래 GRODMORDR, GXEXDRFVL, ORCD 핵심테이블에서 ORDR_CD(처방코드)가 어떤게 2개인지 조회해봄

그러다가 GXEXDRFVL의 혈청크레아티닌 처방코드를 조회해보니까 2개가 나옴
즉 GXEXDRFVL(일반검진검사결과참고치상세)테이블에 해당 성별코드에 처방상세코드에 해당하는 행이 1개만 고유하게 나와야했음.
그런데 혈청크레아티닌은 성별코드와 처방상세코드가 같은데 2개가 나옴

GXEXDRFVL의 키값중 RFVL_SN(참고치일련번호)가 안걸려있어서 2개의 행중 최대값으로 조회하게함(과장님께서 말씀하시길 조인이 안되니까 여러개가 나올수 밖에없다. 그런데 지금 이테블에서 참고치 일련번호가 높은걸 조인해야 하니까 자기 자신과 조인해서 가져오자라고 하심)

이렇게 해서 아래와 같이 작성하니까 제대로 출력됨 그런데 참고치일련번호로 조인을 해야되는지는 차장님께 질문해보라고 하심.

하니까 잘못들어간 데이터가 1개행이 있었고 이행을 삭제하시니까 원래쿼리로 정상작동함.

와......

과장님께서 해결했던 방법

SELECT /*SQLID=kr.amc.amis.hm.gc.pj.store.mapper.HeJudgManageMapper.retrieveOrdrList*/
                     a.PATNO                                                              -- 병원등록번호
                   , a.HE_DT                                                              -- 수검일자 
                   , a.VIST_SN                                                            -- 내원일련번호
                   , c.ORDR_CD                                                            -- 처방코드
                   , c.KOR_NM as ORDR_NM                                                  -- 처방명(한글)
                   , f.RSLT_TYP_VAL                                                       -- 결과유형값
                   , f.RSLT_VAL                                                           -- 결과값
                   , (
                      SELECT RSLT_VAL 
                        FROM GXEXMRSLC 
                       WHERE RSLT_VAL_CD = '000' 
                         AND RSLT_VAL_DTL_CD = f.RSLT_TYP_VAL
                      ) RSLT_TYP_VAL_NM                                                    -- 결과유형명
                   , (
                       SELECT EXM_RFVL_UPLMT_VAL 
                         FROM GXEXDRFVL 
                        WHERE DTL_CD = ORCD.ORDR_DTL_CD
                          AND RSLT_JUDG_CD = 'A'
                          AND (USE_SEX_CD = g.SEX_CD or USE_SEX_CD = 'B') 
                          AND a.HE_DT BETWEEN APPLY_ST_DT(+) AND APPLY_END_DT(+)
                          AND RFVL_SN = ( SELECT MAX(RFVL_SN) 
                                            FROM GXEXDRFVL A 
                                           WHERE A.DTL_CD = DTL_CD
                                             AND A.RSLT_JUDG_CD = RSLT_JUDG_CD
                                             AND A.USE_SEX_CD = USE_SEX_CD
                                             AND A.APPLY_ST_DT = APPLY_ST_DT)
                      ) EXM_RFVL_UPLMT_VAL                                                 -- 상한값
                   , (
                       SELECT EXM_RFVL_LOW_VAL 
                         FROM GXEXDRFVL 
                        WHERE DTL_CD = ORCD.ORDR_DTL_CD
                          AND RSLT_JUDG_CD = 'A'
                          AND (USE_SEX_CD = g.SEX_CD or USE_SEX_CD = 'B') 
                          AND a.HE_DT BETWEEN APPLY_ST_DT(+) AND APPLY_END_DT(+)
                          AND RFVL_SN = ( SELECT MAX(RFVL_SN) 
                                            FROM GXEXDRFVL A 
                                           WHERE A.DTL_CD = DTL_CD
                                             AND A.RSLT_JUDG_CD = RSLT_JUDG_CD
                                             AND A.USE_SEX_CD = USE_SEX_CD
                                             AND A.APPLY_ST_DT = APPLY_ST_DT)
                      ) EXM_RFVL_LOW_VAL                                                   -- 하한값
                   , (
                       SELECT DECODE(EXM_RFVL_LOW_VAL, '', '', EXM_RFVL_LOW_VAL || ' - ' || EXM_RFVL_UPLMT_VAL) 
                         FROM GXEXDRFVL 
                        WHERE DTL_CD = ORCD.ORDR_DTL_CD
                          AND RSLT_JUDG_CD = 'A'
                          AND (USE_SEX_CD = g.SEX_CD or USE_SEX_CD = 'X') 
                          AND a.HE_DT BETWEEN APPLY_ST_DT(+) AND APPLY_END_DT(+)
                          AND RFVL_SN = ( SELECT MAX(RFVL_SN) 
                                            FROM GXEXDRFVL A 
                                           WHERE A.DTL_CD = DTL_CD
                                             AND A.RSLT_JUDG_CD = RSLT_JUDG_CD
                                             AND A.USE_SEX_CD = USE_SEX_CD
                                             AND A.APPLY_ST_DT = APPLY_ST_DT)
                      ) AS STD_VAL                                                         -- 기준치값
                   , c.RSLT_VAL_CD                                                         -- 결과코드  
                   , (
                       SELECT APPLY_END_DT 
                         FROM GXEXDRFVL 
                        WHERE DTL_CD = ORCD.ORDR_DTL_CD
                          AND RSLT_JUDG_CD = 'A' 
                          AND (USE_SEX_CD = g.SEX_CD or USE_SEX_CD = 'B') 
                          AND a.HE_DT BETWEEN APPLY_ST_DT(+) AND APPLY_END_DT(+)
                          AND RFVL_SN = ( SELECT MAX(RFVL_SN) 
                                            FROM GXEXDRFVL A 
                                           WHERE A.DTL_CD = DTL_CD
                                             AND A.RSLT_JUDG_CD = RSLT_JUDG_CD
                                             AND A.USE_SEX_CD = USE_SEX_CD
                                             AND A.APPLY_ST_DT = APPLY_ST_DT)
                      ) as APPLY_END_DT 
                    , ORCD.ORDR_DTL_CD                                                    -- 처방코드상세코드
                    , ORCD.ORDR_DTL_NM                                                    -- 처방코드상세명
                    , f.RSLT_JUDG_CD                                                      -- 판정
                    , CASE WHEN ORCD.ORDR_DTL_CD = 'A026' THEN 1         -- 흉부방사선촬영 결과가 검사내역 최상단으로 위치 
                            WHEN F.RSLT_JUDG_CD = 'R' THEN 2
                            WHEN F.RSLT_JUDG_CD = 'D' THEN 3
                            WHEN F.RSLT_JUDG_CD = 'C' THEN 4
                            WHEN F.RSLT_JUDG_CD = 'B' THEN 5
                            WHEN F.RSLT_JUDG_CD = 'A' THEN 6
                            ELSE 7
                      END AS JUDGORDR
--                 , EXM_RFVL_UPLMT_VAL
--                 , EXM_RFVL_LOW_VAL
--                 , DECODE(EXM_RFVL_LOW_VAL, '', '', EXM_RFVL_LOW_VAL || ' - ' || EXM_RFVL_UPLMT_VAL) 
--                 , APPLY_END_DT
--                 , APPLY_ST_DT
              FROM   GRRVMOTPT a                                                          -- 건강검진예약기본    
                   , GRODMORDR b                                                          -- 건강검진처방기본
                   , GZCDCODCD c                                                          -- 건강검진처방코드
                   , GXEXRGEXM f                                                          -- 일반검진결과관리     
                   , WPPIMINFO g  
                   , GZCDMPKOD PKOD
                   , GZCDCPKCD PKCD
                   ,(
                      SELECT  ENG_NM AS ORDR_CD
                            , DTL_CD AS ORDR_DTL_CD 
                            , KOR_NM AS ORDR_DTL_NM
                        FROM GZCDCORCD
                       WHERE SYNTH_CD = 'RESULT-ITEM'
                         AND  DTL_CD != 'ZZZ'
                         AND  ATRI_VAL4 = 'Y'
                     ) ORCD
                   ,(
                      SELECT HE_BASIS_PKG_CD
                        FROM GRRVRMTCH
                       WHERE PATNO         = '10264560'
                         AND VIST_SN       = 308
                         AND HE_DT         = '20230406'
                         AND (SUBSTR(HE_BASIS_PKG_CD, 1, 3) = 'gbG' OR  SUBSTR(HE_BASIS_PKG_CD, 1, 3) = 'gbT')
                     ) MTCH
--                 , GXEXDRFVL RFVL
             WHERE a.PATNO              = '10264560'
               AND a.HE_DT              = '20230406'
               AND a.VIST_SN            = 308    
               AND PKOD.HE_PKG_CD       = B.HE_PKG_CD   
               AND PKOD.ORDR_CD         = B.ORDR_CD
               AND PKCD.HE_BASIS_PKG_CD = MTCH.HE_BASIS_PKG_CD 
               AND PKCD.HE_PKG_CD       = B.HE_PKG_CD
               AND B.ORDR_CD            = F.ORDR_cD    
               AND a.PATNO              = b.PATNO               
               AND a.HE_DT              = b.HE_DT
               AND a.VIST_SN            = b.VIST_SN
               AND a.PATNO              = f.PATNO(+)               
               AND a.HE_DT              = f.HE_DT(+)
               AND a.VIST_SN            = f.VIST_SN(+)             
               AND a.PATNO              = g.PATNO
               AND b.ORDR_CD            = c.ORDR_CD(+)
               AND b.ORDR_CD            = f.ORDR_CD(+)   
               AND ORCD.ORDR_CD         = B.ORDR_CD            
               AND c.USE_YN             = 'Y' 
               AND b.DEL_YN             = 'N'
               AND ORCD.ORDR_DTL_CD     = F.ORDR_DTL_CD(+)   
--               AND RFVL.DTL_CD(+) = ORCD.ORDR_DTL_CD
--               AND RFVL.RSLT_JUDG_CD(+) = 'A' 
--               AND (RFVL.USE_SEX_CD = g.SEX_CD or RFVL.USE_SEX_CD = 'B') 
--               AND a.HE_DT BETWEEN RFVL.APPLY_ST_DT(+) AND RFVL.APPLY_END_DT(+)
--               AND RFVL.RFVL_SN = ( SELECT MAX(RFVL.RFVL_SN)
--                                      FROM GXEXDRFVL TMP
--                                     WHERE TMP.RSLT_JUDG_CD = RFVL.RSLT_JUDG_CD
--                                       AND TMP.ORDR_CD = RFVL.ORDR_CD
--                                       AND TMP.USE_SEX_CD = RFVL.USE_SEX_CD
--                                       AND TMP.APPLY_ST_DT = RFVL.APPLY_ST_DT
--                                   )
             ORDER BY JUDGORDR, b.ORDR_CD
             
             
             SELECT *
               FROM GRODMORDR
              WHERE PATNO              = '10264560'
                AND HE_DT              = '20230406'
                AND VIST_SN            = 308 
                AND ORDR_CD            = 'BD0011'
             
             SELECT *
             FROM GXEXDRFVL
             WHERE RSLT_JUDG_CD ='A'
             AND ORDR_CD = 'BD0011'
             
             
             SELECT * 
             FROM GXEXDRFVL
             WHERE 1=1
             AND ORDR_CD IN (
             SELECT  ENG_NM AS ORDR_CD
                        FROM GZCDCORCD
                       WHERE SYNTH_CD = 'RESULT-ITEM'
                         AND  DTL_CD != 'ZZZ'
                         AND  ATRI_VAL4 = 'Y'
             )
             AND RSLT_JUDG_CD = 'A'
             AND ORDR_CD = 'BD0011'
             ORDER BY ORDR_CD

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글