2010-11-22 46 views
2

またいで参加します。例えば。イベント・テーブルの内容に関係なく、10人のユーザーと15のイベント・タイプがある場合は、150行が戻されます。トン-SQLの外では、私は3つのテーブルを持っている3つのテーブル

2つのテーブル間で作業する外部結合を取得できます(たとえば、すべてのイベントタイプの期間)。ただし、2回目の外部結合は使用できません。

ありがとうございます!

答えて

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

関連する問題