한글을 잘라서 비교해서 조합이 될까요? 0 7 1,119

by 빳데리빵빵 [2017.06.27 19:21:00]


안녕하세요 

초보자입니다

데이터를 보고 로직을 구현해보려 하는데 머리속으로만 그려서 그런가 잘 안되서 고수님들의 조언을 구합니다

예를들어 A테이블에 값이 한글명과 영어가

주, mn

주식, cu

회, rf

회사, op

이렇게있고 B테이블에

주식회사라는 값이 있으면 두개 테이블을 비교해서 영어로 된 값을 가져오려하는데 경우에 수가 많더라고요 이럴경우 loop를 돌려야하나요? 아니면 단일쿼리로 가능할까요? 여러단어를 저런형태로 구현하려하니 너무 어렵습니다....고수님들의 한수 가르침 부탁드려요 ^^;;

by 마농 [2017.06.28 07:40:50]
WITH t AS
(
SELECT '주' ko, 'mn' en FROM dual
UNION ALL SELECT '주식', 'cu' FROM dual
UNION ALL SELECT '회'  , 'rf' FROM dual
UNION ALL SELECT '회사', 'op' FROM dual
--UNION ALL SELECT '식'  , 'xx' FROM dual
--UNION ALL SELECT '사'  , 'yy' FROM dual
)
, t1(ko_x, en_x) AS
(
SELECT CAST(ko AS VARCHAR2(99)) ko_x
     , CAST(en AS VARCHAR2(99)) en_x
  FROM t
 WHERE INSTR(:v, ko) = 1
 UNION ALL
SELECT p.ko_x || c.ko ko_x
     , p.en_x || c.en en_x
  FROM t1 p
     , t  c
 WHERE INSTR(:v, p.ko_x || c.ko) = 1
   AND p.ko_x != :v
)
SELECT *
  FROM t1
 WHERE ko_x = :v
;

 


by 빳데리빵빵 [2017.06.28 09:47:37]

마농님....감사드려요 제가 이해력이 달려서 아직 이해는 못했는데요 변수로 받아서 처리가 되는거죠? B테이블 값이 여러개일때 조인해서 보여주는게 아니고 하나씩 변수값을 주어서 하는거인거죠? 잘 몰라서 죄송합니다 ;;;; 


by 마농 [2017.06.28 09:55:28]

네. 1건의 입력값 (:v = '주식회사') 에 대한 처리입니다.
테이블 조인이 필요한 건가요?
예시 자료를 정비해서 다시 질문해 주세요.(원본대비 결과표)


by 마농 [2017.06.28 10:02:27]
WITH t_a AS
(
SELECT '주' ko, 'mn' en FROM dual
UNION ALL SELECT '주식', 'cu' FROM dual
UNION ALL SELECT '회'  , 'rf' FROM dual
UNION ALL SELECT '회사', 'op' FROM dual
UNION ALL SELECT '식'  , 'XX' FROM dual
UNION ALL SELECT '사'  , 'YY' FROM dual
)
, t_b AS
(
SELECT '주식회사' v FROM dual
UNION ALL SELECT '주식' FROM dual
UNION ALL SELECT '식사' FROM dual
UNION ALL SELECT '주주' FROM dual
UNION ALL SELECT '회식' FROM dual
)

, t1(v, ko_x, en_x) AS
(
SELECT b.v
     , CAST(a.ko AS VARCHAR2(99)) ko_x
     , CAST(a.en AS VARCHAR2(99)) en_x
  FROM t_a a
     , t_b b
 WHERE INSTR(b.v, a.ko) = 1
 UNION ALL
SELECT p.v
     , p.ko_x || c.ko ko_x
     , p.en_x || c.en en_x
  FROM t1  p
     , t_a c
 WHERE INSTR(p.v, p.ko_x || c.ko) = 1
   AND p.ko_x != p.v
)
SELECT *
  FROM t1
 WHERE ko_x = v
 ORDER BY v, en_x
;

 


by 가을에사랑 [2017.06.28 17:27:58]

질문있습니다. t1이 괄호 안의 from절에 쓰인 t1과 중복이 되는데 상관이 없나요?
단순히 생각하면 테이블이 생성되지 않은 상태에서 t1을 사용하려는듯 보이는데
토드(oracle 10g)에서 실행하니
ORA-32033: 지원되지 않는 열 별칭 지정
라고 에러가 나와서요...

t1(v, ko_x, en_x) AS

(

생략...

SELECT p.v

     , p.ko_x || c.ko ko_x

     , p.en_x || c.en en_x

  FROM t1  p

     , t_a c

 WHERE INSTR(p.v, p.ko_x || c.ko) = 1

   AND p.ko_x != p.v

)


by 마농 [2017.06.28 17:51:54]

11G 부터 사용 가능한 재귀쿼리(Recursive SQL) 사용법입니다.
WITH 문 안에서 WITH 문에서 정의한 자기 자신을 재귀적으로 참조하죠.
계층 쿼리의 또다른 형태라고 보시면 됩니다.


by 가을에사랑 [2017.06.28 17:58:50]

앗 그렇군여...

음..아쉽네요..^^

감사합니다.

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