고수님들 쿼리 개선 부탁드립니다 0 5 6,164

by 일곱난장이 [SQL Query] [2024.08.08 08:13:48]


안녕하십니까, 아래 쿼리 개선 부탁드립니다

TEST_TABLE(테이블Name)

Column_Name ID pk Data Type Comments
PRT_DT 1 Y date 출력일시
ITEM_NM 2 Y varchar2(20) 물품명
COL_A 2   varchar2(1) 물품출고여부
COL_B 3   varchar2(1) 물품하자여부
COL_C 4   varchar2(1) 물품검수여부
COL_D 5   varchar2(1) 물품재고여부
COL_E 6   varchar2(1) 물품상태여부
COL_F 7   varchar2(1) 물품크기여부

........

 

with ITEM_LIST as (
select 'PRT_DT' as ITEM_COL 
     , '2024-08-06'    as VAL
  from dual
select 'ITEM_NM' as ITEM_COL 
     , 'AAA'    as VAL
  from dual
union all  
select 'COL_A' as ITEM_COL 
     , '90'    as VAL
  from dual
union all
select 'COL_B' as ITEM_COL 
     , 'Y'     as VAL
  from dual
union all
select 'COL_D' as ITEM_COL 
     , 'Y'     as 
  from dual  
union all
select 'COL_F' as ITEM_COL 
     , 'Y'
  from dual  
)
select decode(b.ITEM_COL, 'PRT_DT', nvl2(b.ITEM_COL, b.VAL, ''), '') as ITEM_COL
     , decode(b.ITEM_COL, 'ITEM_NM', nvl2(b.ITEM_COL, b.VAL, ''), '') as ITEM_NM
     , decode(b.ITEM_COL, 'COL_A', nvl2(b.ITEM_COL, b.VAL, ''), '') as COL_A
     , decode(b.ITEM_COL, 'COL_B', nvl2(b.ITEM_COL, 'Y', 'N'), 'N') as COL_B
     , decode(b.ITEM_COL, 'COL_C', nvl2(b.ITEM_COL, 'Y', 'N'), 'N') as COL_C
     , decode(b.ITEM_COL, 'COL_D', nvl2(b.ITEM_COL, 'Y', 'N'), 'N') as COL_D
     , decode(b.ITEM_COL, 'COL_E', nvl2(b.ITEM_COL, 'Y', 'N'), 'N') as COL_E
     , decode(b.ITEM_COL, 'COL_F', nvl2(b.ITEM_COL, 'Y', 'N'), 'N') as COL_F
     ....
  from ALL_TAB_NAME a 
     , ITEM_LIST b
 where a.TABEL_NAME = 'TEST_TABLE'
   and a.COLUMN_NAME(+) = b.ITEM_COL헌줄로 나오게 하는데, column이 많아서...

decode를 않쓰고 할 수 있는 방법이 있을까요?

부탁드립니다

 

by 마농 [2024.08.08 08:45:57]

쿼리가 이상합니다.
원래의 의도에 부합하지 않게 작성된 쿼리로 보입니다.
의도가 뭔지? 원본 대비 결과표를 예로 들어 주실 수 있나요?


by 일곱난장이 [2024.08.08 15:33:31]

select 항목 Alias명으로

테이블(TEST_TABLE)정보의 컬럼명(SOLUMN_NAME)으로 outJoin 하는 쿼리 입니다

 


by 마농 [2024.08.08 16:12:59]

1. 오라클이라면 ALL_TABLES 나 USER_TABLES 를 이용하면 될텐데요?
- ALL_TAB_NAME 은 뭔가요? 별도 테이블을 관리하시는 건가요?
- 혹시 ALL_TABLES 의 오타인가요? 아니면 별로로 만들어 관리하는 테이블인가요?
2. 아우터 조인이
- (+) 기호가 반대쪽에 붙어있네요
- nvl2(b.ITEM_COL, b.VAL, '') 은 그냥 b.VAL 만 하면 될 것 같구요
- decode 는 MIN 으로 감싸 주셔야 한줄로 나옵니다.
3. 컬럼명을 일일이 하드코딩 하셨는데.
- 피벗 쿼리는 어차피 하드코딩이 필요한 부분입니다.
- 어차피 하드코딩 해야 한다면? ALL_TAB_NAME 이 필요한지 모르겠네요.


by 일곱난장이 [2024.08.13 06:03:00]

죄송합니다

1.ALL_TAB_NAME -> ALL_TAB_COLUMNS 입니다

2 SYS계정의 ALL_TAB_NAME를 OUTJOIN 합니다

3. 피벗 쿼리인데, 최대한 하드코딩을 줄일 수 있는 방법이 있을까..해서 문의드린겁니다

답변 주셔서, 감사합니다


by 마농 [2024.08.13 11:15:05]

이미 답변 드렸듯이
어차피 하드코딩 할꺼면 all_tab_columns 는 필요 없습니다.
하드코딩 부분을 동적쿼리로 구현한다면?
all_tab_columns 를 이용해 동적쿼리 구성하시면 됩니다.
NVL 처리가 항목별로 다 다를 것 같은데요?
그걸 적용하려면 별도 테이블이 또 관리가 되어야 할 것입니다.
DECODE 를 줄이는 방안으로는 PIVOT 을 이용하는 방안도 있습니다.

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