를 통해 가입 . 예 : 10 명과 15 개의 이벤트 유형이있는 경우, 이벤트 테이블의 내용과 관계없이 150 개의 행이 리턴되어야합니다.톤-SQL 외부 내가 세 개의 테이블이 세 개의 테이블
외부 조인을 통해 두 테이블 (예 : 모든 이벤트 유형의 기간)간에 작업 할 수 있지만 두 번째 외부 조인에서는 작동하지 않습니다.
감사합니다.
를 통해 가입 . 예 : 10 명과 15 개의 이벤트 유형이있는 경우, 이벤트 테이블의 내용과 관계없이 150 개의 행이 리턴되어야합니다.톤-SQL 외부 내가 세 개의 테이블이 세 개의 테이블
외부 조인을 통해 두 테이블 (예 : 모든 이벤트 유형의 기간)간에 작업 할 수 있지만 두 번째 외부 조인에서는 작동하지 않습니다.
감사합니다.
존재하지 않는 관계를 얻으려면 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
당신은 사람과 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
크로스 가입
은 왼쪽 테이블의 각 행에 대해,이 합류 것, 하나 오른쪽 테이블의 모든 행에.
person
및 eventtype
의 모든 조합에 대해 행을 표시하려는 경우 CROSS JOIN
입니다. 우리가 event
에 가입해야하는 기간을 얻으려면 항상 행이 아니기 때문에 OUTER
조인이 필요합니다. '전체'를 사용하면 person
및 event
의 조합에 대해 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)
고마워요. - 이것도 효과가 있으며, 프로세스가 나에게 매우 명확합니다. 외부 조인은 내가 원하는 것이 아니 었습니다. – meepmeep
가, 감사합니다! – meepmeep
당신을 진심으로 환영합니다. –