잡동사니

반응형

질문

복잡한 테이블이 몇 개 있습니다. 그러나 그들의 매핑은 다음과 같습니다.

TABLE_A :

_________________________________
|   LINK_ID     |   TYPE_ID     |
_________________________________
| adfasdnf23454 |   TYPE 1      |
| 43fsdfsdcxsh7 |   TYPE 1      |
| dfkng037sdfbd |   TYPE 1      |
| sd09734fdfhsf |   TYPE 2      |
| khsadf94u5dfc |   TYPE 2      |
| piukvih66wfa8 |   TYPE 3      |
_________________________________

TABLE_B :

_____________________________________________
|   LINK_ID     |  CODE_ID  | CODE_VALUE    |
_____________________________________________
| adfasdnf23454 |    7      |   test 1      |
| fgubk65esdfj7 |    6      |   test 2      |
| ooogfsg354fds |    7      |   test 3      |
| sd09734fdfhsf |    5      |   test 4      |
_____________________________________________

LINK_ID 열은이 두 테이블을 연결합니다.

내 요구 사항은 TABLE_A의 모든 레코드가 특정 CODE_ID가 있는지 여부를 확인하는 것입니다.

  1. 레코드의 CODE_ID가 7 인 경우-열에 CODE_VALUE를 입력합니다.
  2. 레코드의 CODE_ID가 6 인 경우-다른 열에 CODE_VALUE를 입력합니다.
  3. 레코드에 CODE_ID가 없으면 CODE_VALUE가 null로 표시됩니다.

문제는 TABLE_BTABLE_A가없는 레코드가있을 수 있다는 것입니다. 그러나 최종 결과에는 TABLE_A의 레코드 만 포함되어야합니다.

PS : 동일한 행에 필드가 필요하므로 SWITCH CASE가 권장되지 않습니다. (SWITCH CASE 사용시 OBTAINED RESULT에서 동일한 LINK_ID에 대한 여러 행을 참조하십시오.)

얻은 결과 :

_______________________________________________
|   LINK_ID     | CODE_VALUE_1 | CODE_VALUE_1 |
_______________________________________________
| adfasdnf23454 |   test 1     |    null      |
| adfasdnf23454 |   null       |    test 4    |
| sd09734fdfhsf |   test 6     |    null      |
_______________________________________________

예상 결과 :

__________________________________________________
|   LINK_ID     | CODE_VALUE_1  |   CODE_VALUE_2 |
__________________________________________________
| adfasdnf23454 |   test 1      |   test 4       |
| 43fsdfsdcxsh7 |   null        |   null         |
| dfkng037sdfbd |   null        |   null         |
| sd09734fdfhsf |   test 6      |   null         |
| khsadf94u5dfc |   null        |   null         |
| piukvih66wfa8 |   null        |   null         |
__________________________________________________

누군가 이것을 도울 수 있습니까?


답변1

한 가지 옵션은 두 개의 상호 관련된 하위 쿼리를 사용합니다.

select
    a.link_id,
    (select code_value from table_b b where b.link_id = a.link_id and b.code_id = 7) code_value_1,
    (select code_value from table_b b where b.link_id = a.link_id and b.code_id = 6) code_value_2
from table_a a

이는 table_b 에 중복 된 (link_id, code_id) 가 없다고 가정합니다. 두 개의 left join 을 사용하여 작성할 수도 있습니다. 이는 매우 동일한 논리입니다.

또 다른 솔루션은 단일 왼쪽 조인 과 조건부 집계입니다.

select  
    a.link_id,
    max(case when b.code_id = 7 then b.code_value end) code_value_1,
    max(case when b.code_id = 6 then b.code_value end) code_value_2
from table_a a
left join table_b b on b.link_id = a.link_id and b.code_id in (6, 7)
group by a.link_id


답변2

질문의 문제가되는 부분은 B의 두 항목이 동일한 link_id와 type_id를 갖는 경우 어떻게해야하는지입니다. 최소, 최대, 마지막 항목을 사용할 수 있습니다 (그러나 B의 순서 열이 필요함). 또는 모두 나열 할 수 있습니다.

select * 
from a left join b using (link_id) 
pivot (listagg(code_value, ', ') within group (order by code_value) 
       for code_id in (6 as code6, 7 as code7))

데이터:

create table a (link_id, type_id) as (
  select 'a', 'TYPE 1' from dual union all
  select 'b', 'TYPE 1' from dual union all
  select 'c', 'TYPE 1' from dual union all
  select 'd', 'TYPE 2' from dual );

create table b(LINK_ID, CODE_ID, CODE_VALUE) as (
  select 'a',    6, 'test 1' from dual union all
  select 'a',    7, 'test 2' from dual union all
  select 'a',    7, 'test 3' from dual union all
  select 'b',    7, 'test 4' from dual union all
  select 'd',    6, 'test 5' from dual );

결과:

LINK_ID  TYPE_ID  CODE6     CODE7
a        TYPE 1   test 1    test 2, test 3
b        TYPE 1             test 4
c        TYPE 1
d        TYPE 2   test 5

dbfiddle



 

 

 

 

출처 : https://stackoverflow.com/questions/62696481/conditional-operations-without-using-switch-case

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band