0
votes

Rejoignez plusieurs tables pour ne renvoyer qu'un seul résultat pour chaque enregistrement de la table principale.

Actuellement, j'ai trois tables que je rejoins. J'ai des données émigrées d'un système (ancien) à un autre système (nouveau). J'ai besoin de comparer ces données pour assurer des correspondances, mais aussi des incompatibles. J'ai trois tables. On a la liste des comptes déplacés. Les deux systèmes ont des types d'identification différents de sorte que cette première table est une liste de tous les identifiants pour les deux tables et chaque compte déplacé. C'est donc ma population de base.

Select a.ID1, a.ID2, b.fname as fname_old, b.lnam as lname_old, 
c.fname as fname_new, c.lname as lname_new
from table1 a
left join table2 b
on a.ID1 = b.ID
left join table3 c
on a.ID2 = c.ID


4 commentaires

Vos tables sont étranges. L'ID de table doit identifier une ligne, d'où le nom. Vos tables, cependant, ont des identifiants en double. C'est une mauvaise idée, comme vous l'avez probablement remarqué maintenant.


Sans identifiants uniques, vous vous joignez aux paires d'identifiants dans la table ID. Il y a plusieurs paires de 123 / ABC et vous rejoignez 123 / John / Smith avec ABC / John / Smith et 123 / Tom / Smith avec ABC / TOM / SMITH et dites qu'il n'y a pas de changements. Si je ne jointe que sur des identifiants, cependant, je pouvais aussi bien rejoindre 123 / John / Smith avec ABC / Tom / Smith et 123 / Tom / Smith avec ABC / John / Smith et dire John changé à Tom et à Tom à John. Donc, vous appliquez silencieusement des règles qui ne sont pas dans votre requête. Il semble que vous souhaitiez une itération: trouvez d'abord des lignes inchangées, puis voyez ce qui reste et devinez ce que l'enregistrement est passé dans lequel autre pro proximité.


... et c'est quelque chose que vous voudrez peut-être faire en dehors du SGBD. C'est à dire. Sélectionnez toutes les lignes qui n'ont pas de correspondance parfaite, puis itérer à travers eux dans une programmation de languette. Avec 789 / Betty / Jones avant et XYZ / Betty / Miller et XYZ / Mandy / Jones, Betty a-t-elle été changée à Mandy ou Jones à Miller ou à Betty Jones enlevé et Betty Miller et Mandy Jones ont-ils ajouté? Vous devez compenser les règles et les appliquer. Ce n'est pas une tâche pour SQL.


L'ID dans ce cas est le numéro d'identification du compte. Ce sont deux systèmes séparés que nous changeons aussi. Nous avons un ancien système qui utilise des fichiers plats pour envoyer des données. Nous avons ensuite notre nouveau système basé sur un format JSON qui ingère ces fichiers plats et appliquant également des processus. J'essaie donc de comparer les comptes dans les fosses à colons pour vous assurer que les détails de la reconnaissance des fichiers JSON ont été reportés et traités en conséquence.


5 Réponses :


0
votes

Si ses lignes de double double dans votre première table, vous pouvez essayer de les distincter dans une table dérivée comme ci-dessous:

Select a.ID1, a.ID2, b.fname as fname_old, b.lnam as lname_old, 
c.fname as fname_new, c.lname as lname_new
from (SELECT DISTINCT ID1, ID2 FROM table1) a
left join table2 b
on a.ID1 = b.ID
left join table3 c
on a.ID2 = c.ID


0 commentaires

0
votes

Vous les rejoignez sur les colonnes ID.

Les colonnes ID sont généralement uniques pendant que vous avez plusieurs identifiants identiques et spécifiez une jointure sur ces identifiants.

Depuis que vous devez comparer les données, je vous suggère de rechercher la correspondance et de la façon dont cela fonctionne comme cela semble être plus proche de ce que vous recherchez ici.


1 commentaires

Oui, pour certains des enregistrements, il n'y a qu'un seul identifiant qui facilite la tâche, j'avais la question lorsqu'il y a plusieurs instynacsse du même ID avec différentes données dans les autres champs à comparaître. Merci pour la suggestion que je rechercherai le match et que je vois si cela va mieux servir.



0
votes

Vous pouvez obtenir a match en utilisant row_number () : xxx

Remarque: cela ne préserve pas la "commande" de la valeurs originales, de sorte que toutes les lignes puissent être assorties à tout autre. Pourquoi? tables SQL représentent des ensembles non-commandés.

S'il y a une commande dans les tables, vous pouvez l'utiliser dans la commande par clauses pour obtenir un match cohérent avec la commande.


0 commentaires

0
votes

Si vous avez une possibilité de comparaison pour le nom et le nom de famille, ce code fonctionnera. XXX PRE>

MON Résultat: P>

ID1 ID2 fname_old   lname_old   fname_new   lname_new
ABC 123 John    Smith   John    Smith
ABC 123 Kate    Smith   Kate    Smith
ABC 123 Tom     Smith   Tom     Smith
DEF 456 Alex    Johnson NULL    NULL
DEF 456 Jason   Thomas  Jason   Thomas
DEF 456 Ruby    Thomas  Ruby    Thomas 


0 commentaires

0
votes

Vous dites que ceci est des données transférées à deux systèmes. Vous vous attendez donc à toutes les données. Vous pouvez donc réduire la requête pour trouver uniquement des données qui ne correspondent pas, le cas échéant.

Voici une requête compatible standard SQL. Vous avez taqui votre demande avec Hive. Je ne connais pas la ruche, vous devrez peut-être avoir à ajuster la requête. xxx

Ceci est une jointure totale complète. Il retourne toutes les lignes sans correspondance exacte dans l'autre table. Cependant, il ne devinait pas que les rangées déviantes peuvent être des paires. Vous obtiendrez un résultat comme celui-ci: xxx

Comme vous le voyez, vous devriez examiner ce résultat manuellement. Mais idéalement, la requête ne devrait pas retourner une ligne du tout, ce qui permettrait de prouver que tout est allé comme prévu et personne (système ou personne) désespéré avec les données: -)


0 commentaires