2016-04-21 4 views
2

Ich versuche, drei Tabellen, Anwendung, Audio, Video zu kombinieren. Sie haben alle das gleiche Schema, aber es gibt "Duplikate" in Audio und Video. Wo ein Eintrag in Video immer auch in Audio angezeigt wird. Ich setze Duplikate in Anführungszeichen, da die gesamte Zeile nicht dupliziert ist, sondern auf drei Feldern basiert.SQL, kombinieren Sie zwei Tabellen mit unterschiedlichen Werten nur (basierend auf nur drei Felder, nicht ganze Zeile)

Audio Tabelle

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

Video Table

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

Anwendungstabelle

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

und ich möchte, dass sie in einer Tabelle kombinieren, die die Daten von Video hält, wenn es Duplikate - so sieht man, dass John nur einmal auftaucht, mit der Qualität und dem Calltyp aus der Videotabelle:

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

I AUSNAHME und UNION zu verwenden versuchen, alle Zeilen in Audio zu wählen, die in Video nicht auftauchen, dann mit Video-Beitritt, aber da es sie so einzigartig ist, zu sehen, weil Calltype immer anders ist, und Qualität könnte möglicherweise anders sein.

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

Bitte kennzeichnen Sie Ihre Frage mit der Datenbank, die Sie verwenden. –

Antwort

1

Hmmm, ich würde das tun, wie:

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 
       ); 

Hinweise:

  • Verwenden UNION ALL statt UNION es sei denn, Sie absichtlich den Aufwand für das Entfernen von Dubletten entstehen soll.
  • Dies sollte in jeder Datenbank funktionieren; Es verwendet Standard-SQL.
  • Seien Sie vorsichtig mit der Zeit. Sind Sie sicher, sie sind genau das gleiche, bis auf die Millisekunde?
+0

Sieht so aus, als ob das funktioniert! Danke! Können Sie erklären, was Sie meinen, wenn Sie mit UNION vs UNION ALL einen Overhead verursachen? –

+0

@MDo. . . 'UNION' entfernt doppelte Werte. Dies ist eine teure Operation. "UNION ALL" entfernt keine Duplikate. –

Verwandte Themen