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.
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).
Cela fonctionne pour PL/SQL:
select count(*), id,address from table group by id,address having count(*)<2
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
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.