깽쟈
491
2015-07-07 01:20:14
3
1529

query 만드는 방법이 어렵습니다. 도움 부탁드려요.


안녕하세요.

Query를 이용하여 아래의 3개 테이블을 가지고, Result 테이블의 결과를 뽑을 수 있을까요?


제가 원하는 결과는 아래와 같습니다.


sv.version, sv.status는 sv테이블의 version 중 가장 마지막 (가장 큰 숫자) 버전의 row 값을 가지고 옵니다. 단, 해당 데이터가 없을 경우 null이 표기됩니다.

이 Result는 매우 자주 사용되므로, view로 만드려고 했으나 mariaDB에서는 view 안에서 서브쿼리를 지원하지 않는 것 같더군요. 그냥 query로 대충 만들어 보았으나 잘 안되네요.

0
  • 답변 3

  • fx
    1k
    2015-07-07 08:59:42

    mariaDB 는 잘 몰라서 오라클 쿼리를 적어봅니다.



    with p as (

      select 50 no,'test' code from dual

    )

    , s as (

      select 20 no, 50 p_no,'tt_sc001' name from dual union all

      select 21 no, 50 p_no,'tt_sc002' name from dual union all

      select 22 no, 50 p_no,'tt_sc003' name from dual

    )

    , sv as (

      select 1 no, 20 s_no, 1 version, 'app' status from dual union all

      select 2 no, 20 s_no, 2 version, 'app' status from dual union all

      select 3 no, 20 s_no, 3 version, 'rej' status from dual union all

      select 4 no, 21 s_no, 1 version, 'app' status from dual union all

      select 5 no, 21 s_no, 2 version, 'app' status from dual

    )

    select 

      p.no, p.code, s.name, svg.version, sv.status

    from p inner join s

    on p.no = s.p_no

    left outer join (

      select s_no, max(version) version from sv group by s_no

    )svg

    on s.no = svg.s_no

    left outer join sv

    on svg.s_no = sv.s_no

    and svg.version = sv.version

    ;




    with p as (

      select 50 no,'test' code from dual

    )

    , s as (

      select 20 no, 50 p_no,'tt_sc001' name from dual union all

      select 21 no, 50 p_no,'tt_sc002' name from dual union all

      select 22 no, 50 p_no,'tt_sc003' name from dual

    )

    , sv as (

      select 1 no, 20 s_no, 1 version, 'app' status from dual union all

      select 2 no, 20 s_no, 2 version, 'app' status from dual union all

      select 3 no, 20 s_no, 3 version, 'rej' status from dual union all

      select 4 no, 21 s_no, 1 version, 'app' status from dual union all

      select 5 no, 21 s_no, 2 version, 'app' status from dual

    )

    select 

      p.no, p.code, s.name, svg.version, svg.status

    from p inner join s

    on p.no = s.p_no

    left outer join (

      select no, s_no, version, status, row_number() over(partition by s_no order by version desc) rn from sv

    )svg

    on s.no = svg.s_no

    and svg.rn = 1


  • setia
    61
    2015-07-07 09:26:41
    오랜만에 한거라 효율적이라고는 말 못하겠네요..
    답은 나오니 참고 하십시오.

    select s.p_no, code, name, version, status from s,
           (  
               select s.name as name1, 
               case when MAX(sv.version IS NULL)=1 THEN NULL ELSE max(sv.version) END AS version ,
               status
               from s LEFT OUTER JOIN sv ON s.no = sv.s_no
               group by s.name
            ) s1, p
    where s.name = s1.name1 and p.no = s.p_no
  • 깽쟈
    491
    2015-07-07 09:39:17

    답변 주신 두 분 모두 대단히 감사합니다.

    오라클용 query지만 version의 가장 마지막에 해당하는 row를 추출하는 부분이 큰 도움이 되었습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.