2012-07-05 3 views
5

Ich habe eine Tabelle, schrecklich entworfen (nicht mein Glück zu tun), dass speichern Daten in einer Art und Weise ähnlich wie die folgenden:wo Tabelle. * <> Tabelle. * - Gibt es eine Möglichkeit, so etwas zu tun?

[key], [lease_id], [BUILDING_NAME], ~ 20 weiteren Spalten Daten

Ein lease_id kann und wird für ein Zentrum und eine Zentrale existieren. Ich wurde gebeten, alle Instanzen zu finden, in denen Daten in einem Gebäude für einen Mietvertrag nicht mit den Daten in der Zentrale für denselben Mietvertrag übereinstimmen.

Ich kann dies ganz einfach mit einem Self Join tun. Die Herausforderung hier ist, dass es etwa 20 Spalten zu vergleichen gibt und obwohl ich jeden manuell eingeben konnte, fragte ich mich, ob es eine bessere Möglichkeit gibt, dies zu tun (was auch bedeuten würde, dass die Abfrage in Zukunft unter Berücksichtigung von Tabellenänderungen verwendet werden könnte)).

In syntaxtically lächerlich psuedo Code- ich etwas will ähnlich wie tun, was folgende tun würde, wenn sie zur Arbeit waren:

select lp.* 
from lease_proposal lp 
     inner join 
     (
      select * 
      from lease_proposal lp2 
      where building_id = '001' -- assume 001 is head office for sake of example 
     ) lp2 
      on lp2.lease_id = lp.lease_id 
where lp.* <> lp2.* 

Antwort

5

Sie tun könnten, einen INTERSECT Betrieb alle Zeilen zu finden, wo alle Daten abgeglichen, dann LEFT JOIN die nur die Zeilen führen und wählen, wo es keine Kreuzung war:

SELECT 
    a.* 
FROM 
    lease_proposal a 
LEFT JOIN 
    (
     SELECT * 
     FROM lease_proposal 

     INTERSECT 

     SELECT * 
     FROM lease_proposal 
     WHERE building_id = 001 
    ) b ON a.lease_id = b.lease_id 
WHERE 
    b.lease_id IS NULL 

Wenn SQL Server es unterstützt, können Sie auch eine NATURAL LEFT JOIN wie so verwenden:

SELECT 
    a.* 
FROM 
    lease_proposal a 
NATURAL LEFT JOIN 
    (
     SELECT * 
     FROM lease_proposal 
     WHERE building_id = 001 
    ) b 
WHERE b.lease_id IS NULL 
+0

Dies ist in SQL Server nicht verfügbar ist, finden Sie unter: http://stackoverflow.com/questions/4826613/natural-join-in-sql-server – Codingo

+0

Das ist mein Wissen noch ein Stück geschoben - wirklich großen Beitrag, Dankeschön – Codingo

+2

Wenn Sie 'SELECT * FROM lease_proposal INTERSECT' aus der Abfrage herauslassen, erhalten Sie die gleichen Ergebnisse. 'INTERSECT' unterdrückt nur doppelte Zeilen, wobei' building_id = '001'', falls vorhanden, sind. Sie verwenden dann die resultierende Teilmenge, um Zeilen zu finden, die nicht mit einem anderen Kriterium übereinstimmen, und es würde nicht anzeigen, ob die Teilmenge Duplikate enthielt oder nicht, weil Sie immer noch Zeilen wünschen, die in der Teilmenge * nicht * sind. –

Verwandte Themen