2

アプリケーション、オーディオ、ビデオの 3 つのテーブルを結合しようとしています。それらはすべて同じスキーマを持っていますが、オーディオとビデオには「重複」があります。ビデオのエントリは常にオーディオにも表示されます。行全体が重複しているのではなく、3 つのフィールドに基づいているため、重複を引用符で囲みます。

オーディオテーブル

   **Calls   | StartTime    | EndTime       | Quality | CallType**
      John   | 3/15/16 8:01 | 3/15/16 9:01  |   0     |   Audio
      Mary   | 3/15/16 9:35 | 3/15/16 10:34 |   1     |   Audio

ビデオテーブル

   **Calls   | StartTime     | EndTime       | Quality | CallType**
      John   | 3/15/16 8:01  | 3/15/16 9:01  |   1     |   Video
      Sue    | 3/15/16 11:32 | 3/15/16 11:50 |   0     |   Video

アプリケーション表

   **Calls   | StartTime     | EndTime       | Quality | CallType**
      Matt   | 3/15/16 7:31  | 3/15/16 8:01  |   1     |   App
      Bill   | 3/15/16 1:32  | 3/15/16 2:50  |   0     |   App

そして、重複がある場合にビデオからのデータを保持する 1 つのテーブルにそれらを結合したいので、ビデオ テーブルからの品質とコールタイプで、ジョンが 1 回だけ表示されることがわかります。

   **Calls   | StartTime     | EndTime       | Quality | CallType**
      Mary   | 3/15/16 9:35  | 3/15/16 10:34 |   1     |   Audio
      John   | 3/15/16 8:01  | 3/15/16 8:01  |   1     |   Video
      Sue    | 3/15/16 11:32 | 3/15/16 11:50 |   0     |   Video
      Matt   | 3/15/16 7:31  | 3/15/16 8:01  |   1     |   App
      Bill   | 3/15/16 1:32  | 3/15/16 2:50  |   0     |   App

EXCEPT と UNION を使用して、ビデオに表示されないオーディオのすべての行を選択してからビデオに結合しようとしていましたが、calltype が常に異なり、品質が異なる可能性があるため、それらが一意であると見なされているためです。

   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Audio

   EXCEPT
   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Video

   UNION
   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Video

   UNION
   SELECT Calls, StartTime, EndTime, Quality, CallType
   FROM Application
4

1 に答える 1

1

うーん、私はこれを次のようにします:

SELECT Calls, StartTime, EndTime, Quality, CallType
FROM Application
UNION ALL
SELECT Calls, StartTime, EndTime, Quality, CallType
FROM Video
UNION ALL
SELECT Calls, StartTime, EndTime, Quality, CallType
FROM Audio a
WHERE NOT EXISTS (SELECT 1
                  FROM Video v
                  WHERE v.Calls = a.Calls and v.StartTime = a.StartTime and v.EndTime = a.EndTime
                 );

ノート:

  • 重複を削除するオーバーヘッドを意図的に発生させたくない場合を除き、UNION ALL代わりに使用します。UNION
  • これはどのデータベースでも機能するはずです。標準 SQL を使用します。
  • 時代に注意してください。ミリ秒単位まで、それらがまったく同じであると確信していますか?
于 2016-04-21T15:25:05.447 に答える