안녕하십니까, 아래 쿼리 개선 부탁드립니다
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를 않쓰고 할 수 있는 방법이 있을까요?
부탁드립니다
쿼리가 이상합니다.
원래의 의도에 부합하지 않게 작성된 쿼리로 보입니다.
의도가 뭔지? 원본 대비 결과표를 예로 들어 주실 수 있나요?
select 항목 Alias명으로
테이블(TEST_TABLE)정보의 컬럼명(SOLUMN_NAME)으로 outJoin 하는 쿼리 입니다
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 이 필요한지 모르겠네요.
죄송합니다
1.ALL_TAB_NAME -> ALL_TAB_COLUMNS 입니다
2 SYS계정의 ALL_TAB_NAME를 OUTJOIN 합니다
3. 피벗 쿼리인데, 최대한 하드코딩을 줄일 수 있는 방법이 있을까..해서 문의드린겁니다
답변 주셔서, 감사합니다
이미 답변 드렸듯이
어차피 하드코딩 할꺼면 all_tab_columns 는 필요 없습니다.
하드코딩 부분을 동적쿼리로 구현한다면?
all_tab_columns 를 이용해 동적쿼리 구성하시면 됩니다.
NVL 처리가 항목별로 다 다를 것 같은데요?
그걸 적용하려면 별도 테이블이 또 관리가 되어야 할 것입니다.
DECODE 를 줄이는 방안으로는 PIVOT 을 이용하는 방안도 있습니다.