it-swarm.com.de

Finden Sie heraus, welche Zeilen für eine bestimmte Spalte in Teradata SQL unterschiedliche Werte haben

Ich versuche, zwei Adressen derselben ID zu vergleichen, um festzustellen, ob sie übereinstimmen. Zum Beispiel:

Id  Adress Code     Address
1   1               123 Main
1   2               123 Main
2   1               456 Wall
2   2               456 Wall
3   1               789 Right
3   2               100 Left

Ich versuche nur herauszufinden, ob die Adresse für jede ID übereinstimmt. In diesem Fall möchte ich nur ID 3 zurückgeben, da er eine andere Adresse für Adresscode 1 und 2 hat.

22
Hatt

Verknüpfen Sie die Tabelle mit sich selbst und geben Sie zwei verschiedene Aliase an (A und B im folgenden Beispiel). Dies ermöglicht den Vergleich verschiedener Zeilen derselben Tabelle.

SELECT DISTINCT A.Id
FROM
    Address A
    INNER JOIN Address B
        ON A.Id = B.Id AND A.[Adress Code] < B.[Adress Code]
WHERE
    A.Address <> B.Address

Der Vergleich mit "weniger als" < stellt sicher, dass Sie 2 verschiedene Adressen erhalten und nicht zweimal die gleichen 2 Adresscodes erhalten. Die Verwendung von "ungleich" <> würde die Codes als (1, 2) und (2, 1) ergeben. Jeder von ihnen für den Alias ​​A und den Alias ​​B.

Die Join-Klausel ist für das Pairing der Zeilen verantwortlich, wobei die Where-Klausel zusätzliche Bedingungen testet.


Die obige Abfrage funktioniert mit beliebigen Adresscodes. Wenn Sie Adressen mit bestimmten Adresscodes vergleichen möchten, können Sie die Abfrage in ändern

SELECT A.Id
FROM
    Address A
    INNER JOIN Address B
        ON A.Id = B.Id
WHERE                     
    A.[Adress Code] = 1 AND
    B.[Adress Code] = 2 AND
    A.Address <> B.Address

Ich kann mir vorstellen, dass dies nützlich sein kann, um Kunden zu finden, deren Rechnungsanschrift (Adresscode = 1 als Beispiel) von der Lieferadresse (Adresscode = 2) abweicht.

Dies funktioniert für PL/SQL:

select count(*), id,address from table group by id,address having count(*)<2
4
Yasin Okumuş

Sie können dies mit einer Gruppe tun, indem Sie:

select id, addressCode
from t
group by id, addressCode
having min(address) <> max(address)

Eine andere Schreibweise mag dies klarer erscheinen, funktioniert jedoch nicht so gut:

select id, addressCode
from t
group by id, addressCode
having count(distinct address) > 1
2
Gordon Linoff

Ich persönlich würde sie mit Perl oder Python im Format in eine Datei drucken

<COL_NAME>:  <COL_VAL>

für jede Zeile, damit die Datei so viele Zeilen enthält, wie Spalten vorhanden sind. Dann würde ich eine diff zwischen den beiden Dateien durchführen, vorausgesetzt, Sie sind unter Unix oder vergleichen sie mit einem anderen gleichwertigen Dienstprogramm unter einem anderen Betriebssystem. Wenn Sie mehrere Recordsets (d. H. Mehr als eine Zeile) haben, würde ich jeder Dateizeile voranstellen. Dann hätte die Datei NUM_DB_ROWS * NUM_COLS-Zeilen

0
amphibient