서브쿼리중 하나가 단일 행 하위 질의에 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