3 votes

Sélection dans plusieurs tableaux, suppression des doublons

J'ai deux tables dans une BD SQLite, et les deux ont les champs suivants :

idnumber, firstname, middlename, lastname, email, login

Dans l'une des tables, tous ces éléments sont renseignés, mais dans l'autre, ni le numéro d'identification, ni le second prénom ne sont renseignés.

J'aimerais pouvoir faire quelque chose comme.. :

select idnumber, firstname, middlename, lastname, email, login 
from users1,users2 group by login;

Mais je reçois une erreur "ambiguë". En faisant quelque chose comme :

select idnumber, firstname, middlename, lastname, email, login from users1 
union 
select idnumber, firstname, middlename, lastname, email, login from users2;

J'ai cru comprendre que l'union ne devrait pas autoriser les doublons, mais peut-être qu'il ne s'agit pas de vrais doublons puisque tous les champs de la deuxième table d'utilisateurs ne sont pas remplis (par exemple, "20, bob, alan, smith, bob@bob.com, bob" n'est pas la même chose que "NULL, bob, NULL, smith, bob@bob.com, bob").

Des idées ? Qu'est-ce qui me manque ? Tout ce que je veux faire, c'est une déduplication basée sur le "login".

Merci !

2voto

Mosty Mostacho Points 22803

Comme vous le dites union supprimera les enregistrements en double (notez que union all ne le fera pas !). Deux enregistrements sont considérés comme des doublons lorsque toutes les valeurs de leurs colonnes correspondent. Dans l'exemple que vous avez considéré dans votre question, il est clair que NULL n'est pas égal à 20 o 'alan' pour que ces enregistrements ne soient pas considérés comme des doublons.

Edita:

[...] le seul moyen auquel je pense serait de créer une nouvelle table [...].

Ce n'est pas nécessaire. Je pense que vous pouvez faire ce qui suit :

select login, max(idnumber), max(firstname), max(middlename), max(lastname),
  max(email) from (
    select idnumber, firstname, middlename, lastname, email, login from users1 
    union 
    select idnumber, firstname, middlename, lastname, email, login from users2
) final
group by login

Cependant, si vous êtes sûr que vous avez seulement des valeurs différentes sur idnumber et middlename vous pouvez maximiser seulement ces champs et regrouper par tout le reste.

0voto

iammercy Points 1

Vous pourriez joindre la table incomplète à la table complète via le login. Puis manipuler par programme l'ensemble résultant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X