join을 어떤식으로 걸어야 할지 잘 모르겠습니다.ㅠㅠ 0 8 463

by 동글222 [2018.11.25 21:24:36]


테이블 A

code(pk) part(pk) numb(pk) recp_date gubn(pk) du(pk) cu(pk) qty
11 1 1001 20181125 10 01 03 10
11 101 1001 20181125 10 01 03 20
11 2 101 20181125 10 02 01 10

테이블 B

code(pk) part(pk) numb(pk) gubn(pk) du(pk) cu(pk)
11 1 1001 10 01 03
11 101 1001 10 01 03
11 2 101 10 02 01
11 2 102 10 02 02
11 2 103 10 02 03

테이블 C

code(pk) part(pk) numb(pk) name enter_date
11 1 1001 철수 20180301
11 1 102 민수 20170101
11 2 101 창수 20160501
11 2 102 영희 20140328
11 2 103 영수 20180601

 

위 세개 테이블이 있습니다.

테이블 A는 외부로부터 수신받은 데이터 입니다.

테이블 B는 A와 du / cu 컬럼 코드 값으로 매칭시켜 관리하는 테이블 이라고 합니다..

테이블 C는 주 테이블로 세 테이블의 공통 컬럼인 part와/numb을 등록하는 테이블입니다.

 

문제는 테이블 A의 노란색 배경 데이터 입니다.

테이블 C에는 part : 101 numb : 1001로 등록된 데이터가 없으나, 외부에서 데이터를 저렇게 넘겨주고 part : 1 numb : 1001로 표시되길 원합니다.

제가 생각 했을 시에는 테이블 C와 테이블 B를 join하여 테이블 B에 part : 101 numb : 1001인 데이터를 나오지 않게 하고,

거기에 테이블 A를 또 조인시키는 방법이 떠오르는데,, 그렇게 하면 on절에 key값을 모두 사용할 수 없지 않을까해서요..

part와 numb 자체가 다르기때문에 조인을 어떻게 시켜야 할지 모르겠습니다..ㅠㅠ

 

by 마농 [2018.11.26 08:53:19]

글쎄요? 질문이 모호합니다.
규칙이 뭔지 정확하게 알려주셔야 합니다.
단순하게 아무 이유 없이 101 을 1 로 고정값으로 치환하기만 하면 되는 건지?
아니면 뭔가 101 이 1 이 되어야만 하는 이유나 규칙이 존재하는 건지?
디른 케이스는 존재하지 않는지?
원하는 결과표는 어떻게 나와야 하는지?
SQL 이나 조인 관점으로 어렵게 설명하지 마시고.
실제 상황을 그대로 설명해서 이해시켜 주세요.


by 동글222 [2018.11.26 09:08:44]

음..고정값은 아니구요

테이블 A의 du cu컬럼과 테이블B의 du cu 컬럼을 연결시켜서 part와 numb을 보여주고 있는데요.

테이블C에 존재하는 part와 numh으로 보여줘야합니다..

 

현재 결과값은

Part  Numb  Qty

  1      1001   10

  101  1001   20

  2       101    10

 

원하는 결과값은

Part  Numb  Qty

  1      1001   10

  1      1001   20

  2       101    10

 

입니다.  두번째 데이터의 part가 101이아닌 1로 나오도록요..

위 데이터는 일부이고, part가 999 numb가 1001 du 01 cu 03일수도 있습니다

이 경우에도 테이블B의 du cu컬럼과 매칭시켜 part 1 numb 1001로 나와야하구요..

설명이 잘 되었는지 모르겠습니다..ㅠㅠ

 


by 마농 [2018.11.26 09:24:24]
WITH t_a(code, part, numb, recp_date, gubn, du, cu, qty) AS
(
          SELECT 11,   1, 1001, '20181125', '10', '01', '03', 10 FROM dual
UNION ALL SELECT 11, 101, 1001, '20181125', '10', '01', '03', 20 FROM dual
UNION ALL SELECT 11, 999, 1001, '20181125', '10', '01', '03', 30 FROM dual  -- 추가
UNION ALL SELECT 11,   2,  101, '20181125', '10', '02', '01', 10 FROM dual
)
, t_b(code, part, numb, gubn, du, cu) AS
( 
          SELECT 11,   1, 1001, '10', '01', '03' FROM dual
UNION ALL SELECT 11, 101, 1001, '10', '01', '03' FROM dual
UNION ALL SELECT 11, 999, 1001, '10', '01', '03' FROM dual  -- 추가
UNION ALL SELECT 11,   2,  101, '10', '02', '01' FROM dual
UNION ALL SELECT 11,   2,  102, '10', '02', '02' FROM dual
UNION ALL SELECT 11,   2,  103, '10', '02', '03' FROM dual
)
, t_c(code, part, numb, name, enter_date) AS
(
          SELECT 11, 1, 1001, '철수', '20180301' FROM dual
UNION ALL SELECT 11, 1,  102, '민수', '20170101' FROM dual
UNION ALL SELECT 11, 2,  101, '창수', '20160501' FROM dual
UNION ALL SELECT 11, 2,  102, '영희', '20140328' FROM dual
UNION ALL SELECT 11, 2,  103, '영수', '20180601' FROM dual
)
SELECT c.code
     , c.part
     , c.numb
     , c.name
     , a.recp_date
     , a.qty
  FROM t_a a
     , t_b b
     , t_c c
 WHERE a.code = b.code
   AND a.numb = b.numb
   AND a.gubn = b.gubn
   AND a.du   = b.du
   AND a.cu   = b.cu
   AND b.code = c.code
   AND b.part = c.part
   AND b.numb = c.numb
;

 


by 동글222 [2018.11.26 09:35:07]

헛,,정말감사합니다..! 

저런 방법이 있었군요,,

정말정말감사합니다!!


by 동글222 [2018.11.26 10:03:06]

아 혹시 numb가 고정이아니라,, part 999 numb 999 du 01 cu 03 이런 데이터일 수도 있는데,, 이런경우에도 방법이 있을까요..?

where절에 numb를 빼면 나오기는하는데,, key인데 조건절에 다 안걸어도 괜찮은가요..?


by 마농 [2018.11.26 10:24:46]

part 가 101 이 1 일 수 있어서 part 조건을 뺀건데요?
numb 가 999 가 1001 일 수 있어서 numb 조건을 빼야 한다면?
part, numb 둘 다 빼면 남은 조건은 code 와 gubn 뿐인데요?
하지만 이 값은 지금 예를 들어주신 걸 보면 변별력이 없습니다.
그냥 막 뺀다고 될게 아닐 건데요?

지금 원하시는 상황을 정확하게 이해해야만 도움을 드릴 수 있는데.
설명이 부족합니다. 예시도 부족하구요.
제가 다른 케이스가 없냐고 물어본 이유는
설명이 부족하여 샘플을 보고 설명과 조합하여 질문을 이해해 보려고 한 것입니다.
설명을 좀더 정확하게 해주시고, 셈플 케이스도 가능한 케이스 모두 보여주세요.
그리고 앞서 말씀드렸듯이. 조인이나 쿼리 관점, 프로그래밍 관점이 아닌
일반적인 실제 상황 관점으로 설명해 주세요.
실생활에서 왜 이런 자료가 발생하는지?


by 마농 [2018.11.26 10:41:08]
WITH t_a(code, part, numb, recp_date, gubn, du, cu, qty) AS
(
          SELECT 11,   1, 1001, '20181125', '10', '01', '03', 10 FROM dual
UNION ALL SELECT 11, 101, 1001, '20181125', '10', '01', '03', 20 FROM dual
UNION ALL SELECT 11, 999, 1001, '20181125', '10', '01', '03', 30 FROM dual  -- 추가
UNION ALL SELECT 11,   7,  999, '20181125', '10', '01', '03', 40 FROM dual  -- 추가
UNION ALL SELECT 11,   2,  101, '20181125', '10', '02', '01', 10 FROM dual
)
, t_b(code, part, numb, gubn, du, cu) AS
( 
          SELECT 11,   1, 1001, '10', '01', '03' FROM dual
UNION ALL SELECT 11, 101, 1001, '10', '01', '03' FROM dual
UNION ALL SELECT 11, 999, 1001, '10', '01', '03' FROM dual  -- 추가
UNION ALL SELECT 11,   7,  999, '10', '01', '03' FROM dual  -- 추가
UNION ALL SELECT 11,   2,  101, '10', '02', '01' FROM dual
UNION ALL SELECT 11,   2,  102, '10', '02', '02' FROM dual
UNION ALL SELECT 11,   2,  103, '10', '02', '03' FROM dual
)
, t_c(code, part, numb, name, enter_date) AS
(
          SELECT 11, 1, 1001, '철수', '20180301' FROM dual
UNION ALL SELECT 11, 1,  102, '민수', '20170101' FROM dual
UNION ALL SELECT 11, 2,  101, '창수', '20160501' FROM dual
UNION ALL SELECT 11, 2,  102, '영희', '20140328' FROM dual
UNION ALL SELECT 11, 2,  103, '영수', '20180601' FROM dual
)
SELECT c.code
     , c.part
     , c.numb
     , c.name
     , a.recp_date
     , a.qty
  FROM t_a a
     , t_b x  -- 추가(a 와 b 사이에 연결고리 x 추가)
     , t_b b
     , t_c c
 WHERE a.code = x.code
   AND a.part = x.part
   AND a.numb = x.numb
   -------------------
   AND x.gubn = b.gubn
   AND x.du   = b.du
   AND x.cu   = b.cu
   -------------------
   AND b.code = c.code
   AND b.part = c.part
   AND b.numb = c.numb
;

 


by 마농 [2018.11.26 11:05:42]

다시 보니 a 에 이미 gubn, du, cu 가 있었네요.
(gubn, du, cu)로 그냥 a, b 조인 걸면 되겠네요.
 

SELECT c.code
     , c.part
     , c.numb
     , c.name
     , a.recp_date
     , a.qty
  FROM t_a a
     , t_b b
     , t_c c
 WHERE a.gubn = b.gubn
   AND a.du   = b.du
   AND a.cu   = b.cu
   -------------------
   AND b.code = c.code
   AND b.part = c.part
   AND b.numb = c.numb
;

 

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