web-dev-qa-db-fra.com

Trouver les lignes qui ont des valeurs différentes pour une colonne donnée dans Teradata SQL

J'essaie de comparer deux adresses du même ID pour voir si elles correspondent. Par exemple:

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

J'essaie simplement de savoir si l'adresse de chaque ID correspond. Donc, dans ce cas, je souhaite renvoyer uniquement l'ID 3, qui a une adresse différente pour les codes d'adresse 1 et 2.

22
Hatt

Joignez la table avec lui-même et attribuez-lui deux alias différents (A et B dans l'exemple suivant). Cela permet de comparer différentes lignes de la même table.

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

La comparaison "inférieur à" < garantit que vous obtenez 2 adresses différentes et que vous n'obtenez pas deux fois le même code d'adresse. Utiliser "pas égal" <> à la place produirait les codes tels que (1, 2) et (2, 1); chacun d’eux pour alias A et alias B à tour de rôle.

La clause join est responsable de l'appariement des lignes où, comme la clause where teste des conditions supplémentaires.


La requête ci-dessus fonctionne avec tous les codes d'adresse. Si vous souhaitez comparer des adresses avec des codes d’adresses spécifiques, vous pouvez modifier la requête en

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

J'imagine que cela pourrait être utile pour trouver des clients ayant une adresse de facturation (code adresse = 1 par exemple) différente de l'adresse de livraison (code adresse = 2).

29

Cela fonctionne pour PL/SQL:

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

Vous pouvez le faire en utilisant un groupe de:

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

Une autre façon d’écrire ceci peut sembler plus claire, mais ne fonctionne pas aussi bien:

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

Personnellement, je les imprimerais dans un fichier en utilisant Perl ou Python au format

<COL_NAME>:  <COL_VAL>

pour chaque ligne afin que le fichier comporte autant de lignes qu'il y a de colonnes. Ensuite, je ferais une diff entre les deux fichiers, en supposant que vous utilisiez Unix ou que vous les compariez avec une utilité équivalente sur un autre système d'exploitation. Si vous avez plusieurs jeux d’enregistrements (c’est-à-dire plus d’une ligne), j’ajouterais des préfixes à chaque ligne de fichier, puis le fichier aurait NUM_DB_ROWS * NUM_COLS lignes.

0
amphibient