오라클 쿼리 1

by CMSCP [SQL Query] [2023.08.15 15:16:48]


쿼리 수행중 힌트 부분 수정에 따라 결과가 다르게 나와서 이런 경우 발생을 할 수 있는지 문의 드립니다. 

플랜 확인시 는 access predicate / filter predicate 에서 조건절을 수행하는 차이는 거 같습니다.

1. use_nl 결과
WORK_DATE L_CODE M_CODE S_CODE WORK_DATE(1) L_CODE(1) M_CODE(1) S_CODE(1) READ_CNT
1 20230807 LD1 MD10 SD10 20230807 LD1 MD10 SD10 62730
2 20230807 LD1 MD10 SD20 20230807 LD1 MD10 SD20 57547
3 20230807 LD1 MD10 SD30
4 20230807 LD1 MD10 SD40
5 20230807 LD1 MD10 SD99

 

2. use_hash 결과 
WORK_DATE L_CODE M_CODE S_CODE WORK_DATE(1) L_CODE(1) M_CODE(1) S_CODE(1) READ_CNT
1 20230807 LD1 MD10 SD10 20230807 LD1 MD10 SD10 62730
2 20230807 LD1 MD10 SD20 20230807 LD1 MD10 SD20 57547
3 20230807 LD1 MD10 SD40 20230807 LD1 MD10 SD40 462086
4 20230807 LD1 MD10 SD99 20230807 LD1 MD10 SD99 582363
5 20230807 LD1 MD10 SD30

 

WITH TB AS (
  SELECT
      NVL(PROCESSED_DATE,'20230807') AS WORK_DATE,
      'LD1' AS L_CODE,
      'MD10'  AS M_CODE,
      DECODE(NVL(SUBSTR(TBL,0,2),'TOTAL'),'01','SD10','02','SD20','03','SD30','05','SD40','TOTAL','SD99') AS S_CODE,
      SUM(CNTT) AS READ_CNT
  FROM TMP_SVC_TABLE
  WHERE PROCESSED_DATE = '20230807'
  GROUP BY ROLLUP((TBL,PROCESSED_DATE))
  ),
TA AS (
  SELECT '20230807'      AS WORK_DATE, 'LD1'             AS L_CODE, 'MD10'               AS M_CODE, 'SD10'               AS S_CODE FROM DUAL union all
  SELECT '20230807'      AS WORK_DATE, 'LD1'             AS L_CODE, 'MD10'               AS M_CODE, 'SD20'               AS S_CODE FROM DUAL union all
  SELECT '20230807'      AS WORK_DATE, 'LD1'             AS L_CODE, 'MD10'               AS M_CODE, 'SD30'               AS S_CODE FROM DUAL union all
  SELECT '20230807'      AS WORK_DATE, 'LD1'             AS L_CODE, 'MD10'               AS M_CODE, 'SD40'               AS S_CODE FROM DUAL union all
  SELECT '20230807'      AS WORK_DATE, 'LD1'             AS L_CODE, 'MD10'               AS M_CODE, 'SD99'               AS S_CODE FROM DUAL )
SELECT  /*+ use_nl(tb ta) */
*
   --TA.*, NVL(TB.READ_CNT,0) AS READ_CNT
FROM  TA, TB
WHERE TA.WORK_DATE = TB.WORK_DATE(+) AND TA.L_CODE = TB.L_CODE(+) AND TA.M_CODE = TB.M_CODE(+) AND TA.S_CODE = TB.S_CODE(+);

by 마농 [2023.08.16 00:58:27]

버그가 아닐런지요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입