2016-08-08 10 views
0

Ich habe 2 Tabellen mit derselben Struktur (Feldnamen). Tabelle 1 und Tabelle 2.SQL Server - alle Datensätze aus linker Tabelle und nur nicht passendem Datensätze aus dem rechten Tabelle

Ich brauche alle Datensätze aus Tabelle 1 zurückzukehren und nur Datensätze aus Tabelle 2, die zu einem Datensatz in Tabelle 1 nicht übereinstimmen/beitreten.

Table2 hat mehr Datensätze als Tabelle 1.

Ich trete die zwei Tabellen auf drei Feldern.

Also im Grunde möchte ich alle Datensätze aus Tabelle 1 zurückgeführt und nur Datensätze, die kein Spiel haben (auf den drei Feldern Beitritt) von Tabelle2 Table1 zurückgegeben.

anders gesagt, nehmen Sie Table1 Aufzeichnungen Vorrang vor table2 Aufzeichnungen in meinem Endergebnis ausgegeben wird, wenn die Datensätze (für die drei Felder denselben Wert) in beiden Tabellen vorhanden

ich wie die unten etwas zu schreiben begonnen, aber ich don‘ Ich denke, es wird funktionieren. Sollte ich stattdessen eine linke äußere Verbindung verwenden?

Select * from table1 t1 
    left join table2 t2 on t1.id = t2.id and t1.date = t2.date and t1.custid= t2.custid 
where t2.id is null or t2.date is null or t2.custid is null 
+0

ist 'id' einen eindeutigen Schlüssel für diese Tabellen? –

+0

Nein, keine der drei aufgeführten Spalten ist in der Tabelle eindeutig. –

Antwort

2

So müssen Sie jede Zeile von table1 und die Zeilen aus table2, die mit table1 nicht übereinstimmen:

SELECT * 
FROM table1 
UNION ALL 
SELECT * 
FROM table2 t2 
WHERE NOT EXISTS(SELECT * FROM table1 
       WHERE id = t2.id 
       AND date = t2.date 
       AND custid = t2.custid); 
+0

Haben wir eine Leistung Implikation haben, wenn wir 'WHERE NOT EXISTS (SELECT * ...' 'WRT WHERE NOT EXISTS (SELECT 1 ...'? – techspider

+0

Dokumentation @techspider auf VORHANDEN für SQL-Server, und ich glaube Orakel sagt, es ignoriert die Spaltenliste alle zusammen, also kein Leistungsunterschied – Matt

+0

@techspider Nein, es ist das selbe Ich benutze normalerweise 'SELECT 1', um klar zu stellen, dass es nur die Existenz überprüft, weiß nicht, warum ich' * 'diesmal benutzt habe – Lamak

2
Select * from table1 t1 
    Union 
Select * from table2 t2 
Where Not exists 
    (Select * from table1 
     Where id = t1.id 
     and date = t1.date 
     and custid= t1.custid) 
Verwandte Themen