2010-11-22 1 views
2

를 통해 가입 . 예 : 10 명과 15 개의 이벤트 유형이있는 경우, 이벤트 테이블의 내용과 관계없이 150 개의 행이 리턴되어야합니다.톤-SQL 외부 내가 세 개의 테이블이 세 개의 테이블

외부 조인을 통해 두 테이블 (예 : 모든 이벤트 유형의 기간)간에 작업 할 수 있지만 두 번째 외부 조인에서는 작동하지 않습니다.

감사합니다.

답변

2

존재하지 않는 관계를 얻으려면 CROSS APPLY을 추가해야합니다.

SELECT q.name, q.description, SUM(q.Duration) 
FROM (
      SELECT p.Name, et.description, Duration = 0 
      FROM person p 
        CROSS APPLY eventtype et 
      UNION ALL   
      SELECT p.Name, et.description, e.duration 
      FROM person p 
        INNER JOIN event e ON e.person_id = p.id 
        INNER JOIN eventtype et ON et.id = e.eventtypeid   
     ) q 
GROUP BY 
     q.Name, q.description   
+0

가, 감사합니다! – meepmeep

+0

당신을 진심으로 환영합니다. –

1

당신은 사람과 EVENTTYPE 가입 교차하고 바로 이벤트 테이블에 결과를 가입 할 수 있습니다 :

SELECT 
    p.Name, 
    et.Description, 
    COALESCE(e.duration,0) 
FROM 
    person p 
     cross join 
    eventtype et 
     left join 
    event e 
     on 
     p.id = e.person_id and 
     et.id = e.eventtype_id 
크로스 가입

은 왼쪽 테이블의 각 행에 대해,이 합류 것, 하나 오른쪽 테이블의 모든 행에.

1

personeventtype의 모든 조합에 대해 행을 표시하려는 경우 CROSS JOIN입니다. 우리가 event에 가입해야하는 기간을 얻으려면 항상 행이 아니기 때문에 OUTER 조인이 필요합니다. '전체'를 사용하면 personevent의 조합에 대해 event 개가있을 수 있으므로 SUM이 필요합니다.

샘플 데이터 :

insert person values (1, 'Joe') 
insert person values (2, 'Bob') 
insert person values (3, 'Tim') 

insert eventtype values (1, 'Cake') 
insert eventtype values (2, 'Pie') 
insert eventtype values (3, 'Beer') 

insert event values (1, 1, 10) 
insert event values (1, 2, 10) 
insert event values (1, 2, 5) 
insert event values (2, 1, 10) 
insert event values (2, 2, 7) 
insert event values (3, 2, 8) 
insert event values (3, 3, 16) 
insert event values (1, 1, 10) 

쿼리 :

SELECT 
    PET.person_id 
    , PET.person_name 
    , PET.eventtype_id 
    , PET.eventtype_description 
    , ISNULL(SUM(E.duration), 0) total_duration 
FROM 
    (
    SELECT 
     P.id person_id 
     , P.name person_name 
     , ET.id eventtype_id 
     , ET.description eventtype_description 
    FROM 
     person P 
     CROSS JOIN eventtype ET 
    ) PET 
    LEFT JOIN event E ON PET.person_id = E.person_id 
        AND PET.eventtype_id = E.eventtype_id 
GROUP BY 
    PET.person_id 
    , PET.person_name 
    , PET.eventtype_id 
    , PET.eventtype_description 

출력 :이 완벽하게 작동

person_id person_name eventtype_id eventtype_description total_duration 
----------- ----------- ------------ --------------------- -------------- 
1   Joe   1   Cake     20 
1   Joe   2   Pie     15 
1   Joe   3   Beer     0 
2   Bob   1   Cake     10 
2   Bob   2   Pie     7 
2   Bob   3   Beer     0 
3   Tim   1   Cake     0 
3   Tim   2   Pie     8 
3   Tim   3   Beer     16 
Warning: Null value is eliminated by an aggregate or other SET operation. 

(9 row(s) affected) 
+0

고마워요. - 이것도 효과가 있으며, 프로세스가 나에게 매우 명확합니다. 외부 조인은 내가 원하는 것이 아니 었습니다. – meepmeep