2016-04-21 51 views
2

我試圖結合三個表,應用程序,音頻,視頻。它們都具有相同的模式,但音頻和視頻中存在「重複」。視頻中的某個條目將始終以「音頻」顯示。由於整行不重複,因此我將重複項放在引號中,但是基於它們的三個字段。SQL,結合兩個表格,只有不同的值(僅基於三個字段,而不是整行)

音頻表

**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 

,我想將它們組合成時,有重複,從視頻保持數據的一個表 - 所以你看到約翰只出現過一次,錄像表的質量和呼叫類型爲:

**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 
+0

請用你正在使用的數據庫標記你的問題。 –

回答

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。
  • 要小心時代。你確定他們是,正好是一樣,降到毫秒?
+0

看起來像這個工作!謝謝! 你能解釋一下UNION與UNION ALL之間的開銷嗎? –

+0

@MDo。 。 。 'UNION'刪除重複值。這是一項昂貴的操作。 'UNION ALL'不會刪除重複項。 –

相關問題