컬럼명과 데이터로 JOIN 0 3 3,219

by 배기염 [SQL Query] JOIN COLUMN [2013.10.31 12:04:35]


A, B 테이블을 가공하여 데이터를 만들고 싶습니다


A 테이블을 PARAM이라는 테이블이라고 가정하고
param_name(기본키), db_column, text(텍스트 안에 기본키 내용이 들어있음), CODE(외래키)
예를 들어 데이터를 표현해 보면
(P1, 'AAA', 'P1 P2 P3', 'ABCD'),
(P2, 'BBB', 'P1 P2 P3', 'ABCD'),
(P3, 'CCC', 'P1 P2 P3', 'ABCD')이런식으로 데이터가 있습니다

B 테이블은 
CODE(기본키), AAA, BBB, CCC
데이터를 표현하면,
('ABCD', '111', '222', '333') 이렇게 데이터가 있어서
A의 CODE와 B의 CODE 컬럼으로 조인해서 데이터를 뽑아오고
replace를 사용하여 A.text안에 A.db_column과 일치하는 데이터를 B 테이블의 컬럼명과 일치하는 데이터로 변경하고 싶습니다.

P1-'AAA'과 B의 AAA의 데이터 '111'로 'P1 P2 P3' => '111 P2 P3'처럼 변경하고 싶습니다.
by 우리집아찌 [2013.10.31 13:13:43]
 
SELECT A.* 
   ,REPLACE(TEXT, PARAM_NAME ,
    dbms_xmlgen.getxmltype('SELECT '|| A.db_column ||' FROM B WHERE code='''|| A.code||'''' ).Extract('//text()') 
    )
 FROM A 


by 마농 [2013.10.31 13:21:56]
WITH a AS
(
SELECT 'P1' param_name, 'AAA' db_column, 'P1 P2 P3' text, 'ABCD' code FROM dual
UNION ALL SELECT 'P2', 'BBB', 'P1 P2 P3', 'ABCD' FROM dual
UNION ALL SELECT 'P3', 'CCC', 'P1 P2 P3', 'ABCD' FROM dual
)
, b AS
(
SELECT 'ABCD' code, '111' aaa, '222' bbb, '333' ccc FROM dual
)
-- 어차피 컬럼명은 몇가지로 한정되어 있겠지요...
SELECT a.code
     , a.param_name
     , a.db_column
     , b.aaa, b.bbb, b.ccc
     , a.text
     , REPLACE(a.text, a.param_name
       , DECODE(a.db_column, 'AAA', b.AAA, 'BBB', b.BBB, 'CCC', b.CCC)
       ) text2
  FROM a, b
 WHERE a.code = b.code
;

by 우리집아찌 [2013.10.31 13:33:32]

아.. 괜히 어렵게 생각했네요.. 간단한데..

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