안녕하십니까, 아래 쿼리 개선 부탁드립니다
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를 않쓰고 할 수 있는 방법이 있을까요?
부탁드립니다
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 이 필요한지 모르겠네요.