2013-08-29 3 views
2

FROM 절의 Sub Query에 유효한 유스 케이스는 무엇입니까? 그 계획은 어떻게 작동합니까? 이렇게 많은 타입의 예가 있습니다. 그 중 하나에 대한 링크는 here이지만이 구성표가 어떻게 작동하는지 알 수 없습니다.from 절의 하위 쿼리는 어떻게 작동합니까?

P .: 답변이 오라클 관련이면 괜찮습니다.

+1

"super query"에서 하위 쿼리를 집계하고 창 함수 또는 'over' 절을 사용할 수 있습니다. – Claude

+1

흠. 가장 일반적인 유형의 하위 쿼리가 아닙니까? 어떻게 작동하는지에 관해서는 하위 쿼리가 반환하는 것과 똑같은 데이터를 포함하는 테이블의 쿼리라고 생각할 수 있습니다. 쿼리가 수퍼 쿼리 열에 종속되어 있지 않으면 이해하기가 더 복잡해집니다. 질문에서 좀 더 구체적인 질문을 할 수 있습니까? 어떤 부분이 혼란 스럽습니까? 어쩌면 예제 쿼리를 게시 할 수 있습니다. – Thilo

+0

@Michael은 답을 제시해 주실 수 있습니다. – Geek

답변

1

다음은 from 절의 하위 쿼리에 대한 몇 가지 사용 사례입니다. 그것이 작동하는 방법은 귀하의 질문에 대한 설명에 설명되어 있습니다 (SQL은 관계 연산자 덕택에 수학적으로 닫힙니다).

1. 피벗 (SQL 서버 2008)

select P.RUN_ID 
     , [2012] = sum(P.[2012]) 
     , [2013] = sum(P.[2013]) 
     , [2014] = sum(P.[2014]) 
     , [2015] = sum(P.[2015]) 
    from (select T.RUN_ID 
       , Y.YEAR 
       , T.MEASURE 
      from SOME_TABLE T 
      inner join 
       YEAR Y 
        on T.SOME_ID = Y.SOME_ID 
     ) T 
    pivot (
      sum(MEASURE) 
      for YEAR in ([2012], [2013], [2014], [2015]) 
     ) P 
    group by 
     P.RUN_ID 
    order by 
     P.RUN_ID 
절 이상

2 (오라클) 노동 조합

select S.Text_ID 
     , row_number() over (partition by S.Text_ID order by S.Segmentstart) as Segmentnumber 
     , S.Segment_ID 
     , S.Segmentstart 
     , S.Segmentend 
     , S.Segmentfragment 
    from (select S.Text_ID as Text_ID 
       , S.Satz_ID as Segment_ID 
       , S.Start as Segmentstart 
       , S.End as Segmentend 
       , S.Fragment as Segmentfragment 
      from Mainclauses S 
      union all 
     select X.ID as Text_ID 
       , null as Segment_ID 
       , coalesce(S.End, 0) as Segmentstart 
       , lead(S.Start, 1, X.CONTENT_LENGTH) over (partition by X.ID order by S.Start) as Segmentend 
       , 'X' as Segmentfragment 
      from Texts X 
      left join 
       Mainclauses S 
        on X.ID = S.Text_ID 
      union all 
     select X.ID as Text_ID 
       , null as Segment_ID 
       , 0 as Segmentstart 
       , min(S.Start) as Segmentend 
       , 'X' as Segmentfragment 
      from Texts X 
      inner join 
       Mainclauses S 
        on X.ID = S.Text_ID 
      group by 
       X.ID 
     ) S 

3 절 이상 (SQL 서버 2008을 기반으로) 합계와 합계

select E.X_ID 
     , Z.SomeThing 
     , sum(Z.OtherMeasure * E.Measure) as CombinedMeasure 
     , Sorting = row_number() over 
      (partition by 
         E.X_ID 
       order by 
         Z.SomeThing 
     ) 
    from (select E.X_ID 
       , E.Y_ID 
       , Measure = sum(E.Measure) 
      from SomeTable E 
      group by 
       E.X_ID 
       , E.Y_ID 
     ) E 
    inner join 
     OtherTable Z 
      on E.Y_ID  = Z.Y_ID 

4. 계산 비율 (SQL 서버 2008) 두 개 이상의 테이블 (SQL 서버 2008)

select * 
    from (select A, M = sum(M) from S group by A) X 
    full outer join 
     (select A, M = sum(M) from T group by A) Y 
      on X.A = Y.A 
where A.X is null 
    or B.X is null 
    or abs(A.M - B.M) > 0.00000001 

with SomeData 
     (Main_ID 
     , Sub_ID 
     , Measure 
    ) 
    as (select Main_ID 
      , Sub_ID 
      , Measure = sum(Measure) 
     from SomeTable P 
     group by 
       Main_ID 
      , Sub_ID 
    ) 
select Main_ID 
     , Sub_ID 
     , Ratio = D.Measure/sum(M.Measure) over (partition by M.Main_ID) 
    from SomeData D 
    inner join 
     (select Main_ID 
       , Measure = sum(Measure) 
      from SomeData 
      group by 
       Main_ID 
     having sum(Measure) != 0 
     ) M 
      on M.Main_ID = D.Main_ID 

5. 부분을 비교 한 :이 있습니다 예제에서와 나는 from 절의 하위 쿼리가 결과를 얻는 좋은 해결책이라고 생각했습니다.