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
5 Réponses :
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
Vous les rejoignez sur les colonnes ID. P>
Les colonnes ID sont généralement uniques pendant que vous avez plusieurs identifiants identiques et spécifiez une jointure sur ces identifiants. P>
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. P>
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.
Vous pouvez obtenir a em> match en utilisant Remarque: cela ne préserve pas la "commande" de la valeurs originales, de sorte que toutes les lignes puissent être assorties à tout autre. Pourquoi? S'il y a une commande dans les tables, vous pouvez l'utiliser dans la commande row_number () code>:
par code> clauses pour obtenir un match cohérent avec la commande. p> p>
Si vous avez une possibilité de comparaison pour le nom et le nom de famille, ce code fonctionnera. 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
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. P> 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: p> 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: -) p> p>
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.