IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Comparaison de tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 40
    Points
    40
    Par défaut Comparaison de tables
    Bonjour j'aimerais effectuer une comparaison sur 2 tables de ma base pour voir si elles contiennent les mêmes infos... Surtout les e-mails.
    En fait je voudrais selectionner les e-mails qui apparaissent dans une table mais pas l'autre... j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Contacts.Adressedemessagerie, Contacts.nom
    FROM Contacts
    WHERE (Contacts.Adressedemessagerie) NOT IN (select user_table.email_user from user_table);
    Mais sa renvoi rien alors que cela le devrait...
    Je sais pas trop comment faire...
    Alors merci d'avance pour un petit coup de main !
    A bientôt

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Bonjour

    Vérifiez que les types des champs des deux tables soient comparables.

    Citation Envoyé par viktor951 Voir le message
    En fait je voudrais selectionner les e-mails qui apparaissent dans une table mais pas l'autre...
    Sauf erreur de ma part, cela peut se régler avec un EXCEPT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT email FROM table1
    EXCEPT
    SELECT email FROM table2
    Le souci, c'est que EXCEPT prend les tous les résultats de la première requête, et en soustrait les résultats de la deuxième. Problème ? Les emails contenus uniquement dans la deuxième table ne seront pas repris (à tester tout de même, mais j'en suis quasi certain).

    Aussi, EXCEPT n'est pas supporté par MySQL. On peut alors utiliser un NOT IN (comme vous l'avez fait, d'ailleurs).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT email FROM table1 WHERE email NOT IN (SELECT email FROM table2)
    Si le champ peut être NULL, il serait bon d'ajouter des IS NOT NULL. Encore une fois, cette requête prendra les emails de la première table qui ne sont pas dans la deuxième, mais pas l'inverse.

    D'ailleurs, votre souci vient peut-être de là : votre requête ne cherche que les emails qui sont dans Contacts mais pas dans user_table. Essayez l'inverse. Avec un peu de chance... Dans un tel cas, il vous faudra 2*requêtes, ou une UNION, pour tout prendre d'un coup.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 40
    Points
    40
    Par défaut
    Merci de ton aide, je vais encore regarder à tout ca avec ces nouveaux éléments, je te tiens au courant
    A toute

  4. #4
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 40
    Points
    40
    Par défaut
    Re-Bonjour,
    Alors j'ai testé les différentes choses dont on a parlé, cela n'a pas marché...
    J'ai fini par trouver une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Contacts.Adressedemessagerie, count(contacts.Nom)
    FROM Contacts LEFT JOIN user_table ON Contacts.Adressedemessagerie=user_table.email_user
    WHERE (((user_table.email_user) Is Null))
    GROUP BY contacts.adressedemessagerie;
    cela fonctionne bien

    Maintenant j'ai un problème avec INSERT j'ai du mal à m'en servir...
    J'aimerais ajouter seulement 4champs à une table (les lignes récupérés ci-dessus)
    j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO Contacts ( prénom, Nom, Société, Titre1 )
    SELECT user_table.prenom_user, user_table.nom_user, num_ent_principal, fonction_user
    FROM user_table LEFT JOIN contacts ON contacts.Adressedemessagerie=user_table.email_user
    WHERE (((Contacts.Adressedemessagerie) Is Null))
    GROUP BY user_table.email_user;
    Sans succès
    Si quelqu'un à une petite idée cela serait gentil
    Merci à bientôt !

  5. #5
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Contacts.Adressedemessagerie, count(contacts.Nom)
    FROM Contacts LEFT JOIN user_table ON Contacts.Adressedemessagerie=user_table.email_user
    WHERE (((user_table.email_user) Is Null))
    GROUP BY contacts.adressedemessagerie;
    Mais de nouveau, ça ne prendra que les adresses qui sont dans Contacts sans être dans user_table, et non l'inverse. Enfin, c'est sans doute ce qu'il vous faut. S'il vous les faut décidément dans les deux sens, vous pouvez essayer un FULL*JOIN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((user_table.email_user) Is Null))
    Pourquoi autant de parenthèses ? Vous pouvez toutes les supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    user_table.email_user IS NULL
    Aussi, je suis étonné de voir un GROUP BY dans une requête sans fonction d'agrégat. Est-elle vraiment utile ? Dans ce cas... à quoi ?
    (Note : peut-être pensiez-vous à ORDER BY ?)

    Sans succès
    Si quelqu'un à une petite idée cela serait gentil
    Quelle est l'erreur remontée par le serveur SQL ?
    Vérifiez au passage que le type des champs concorde.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 40
    Points
    40
    Par défaut
    Alors je réponds par une question ^^ Qu'est ce qu'un agrégat ?
    Le GROUP BY me sert juste à enlever tous les doublons d'adresses de messageries... c'est peut-être pas très bien écrit :s
    Et mon problème justement est un problème d'agrégat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée 'prenom_user' comme une partie de la fonction d'agrégat.
    Pour info ... en tatonnant un peu j'ai vu que cela marchait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO Contacts ( prénom )
    SELECT user_table.email_user
    FROM user_table LEFT JOIN contacts ON contacts.Adressedemessagerie=user_table.email_user
    WHERE (((Contacts.Adressedemessagerie) Is Null))
    GROUP BY user_table.email_user;
    J'en ai déduit que ca doit etre un problème avec le group by mais je ne comprends pas...
    Merci de ton aide par avance

  7. #7
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Une fonction d'agrégat, c'est une fonction qui agrège (réunit, assemble) les valeurs de plusieurs lignes pour en faire une seule.
    L'exemple le plus simple est la fonction SUM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(montant) FROM commande
    Cette requête va faire la somme du montant de toutes les commandes. Elle donnera un résultat similaire à ceci:
    Mais parfois on veut grouper le résultat selon un critère. Eh oui, vous avez deviné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT annee, SUM(montant) FROM commande GROUP BY annee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    2005    5864.26
    2006    7845.12
    2007    6235.14
    Je suppose que dans vos tables, les adresses email sont uniques. Eh oui, en général, une adresse ne correspond qu'à une et une seule personne. Si c'est le cas, et que votre select est bien formé, vous ne devriez pas avoir besoin d'un GROUP BY.

    Si cette dernière requête fonctionne, alors c'est surement un problème de type de champs. Oui j'insiste, c'est parce que si c'est pas ça je pige rien Pourrait-on jeter un oeil aux CREATE TABLE ?

  8. #8
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 40
    Points
    40
    Par défaut
    Bonjour à toi !
    Les tables je les ai créé par fichiers excel... que j'ai eux même extraits d'une autre base en faite...
    Je met les données mails de notre messagerie à jour par rapport à l'extranet en fait...
    Je dois faire un Group By car certaines personnes appartiennent à différents services et leur mail se répète dans l'extranet pour chacun des services où ils sont...
    Je suis arrivé à quelque chose de pas mal (bien même ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT num_user, prenom_user, nom_user, email_user, fonction_user, count(user_table.num_user)
    FROM user_table LEFT JOIN contacts ON contacts.Adressedemessagerie=user_table.email_user
    WHERE Contacts.Adressedemessagerie Is Null AND user_table.email_user IS NOT NULL
    GROUP BY user_table.email_user, num_user, prenom_user, nom_user, email_user, fonction_user;
    Et j'ai la même requête avec les champs inversé pour récup les info dans l'autre sens (là c'est les User pas dans Contacts)
    Et pour filtrer les adresses de messagerie qui ont été mal enregistrées j'ai fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Contacts.Prénom, Contacts.Nom, Contacts.Adressedemessagerie, user_table.email_user, count(Nom)
    FROM Contacts INNER JOIN user_table ON (user_table.email_user<>Contacts.Adressedemessagerie) AND (Contacts.Nom=user_table.nom_user) AND (Contacts.Prénom=user_table.prenom_user)
    GROUP BY Contacts.Prénom, Contacts.Nom, Contacts.Adressedemessagerie, user_table.email_user;
    Cela ressort les gens pour qui l'adresse mail n'est pas la même dans les deux tables, mais avec le même nom et prénom. (En espérant donc que le nom soit également bien rentré dans les deux tables Mais au bout d'un moment faut arrêter de faire des fautes de frappes hein aussi :p)

    Voilà, voilà, au final je pense que mon problème était qu'il faut mettre les champs à sélectionner dans le Group By, pour que cela fonctionne bien...

    Merci pour tes explications en tout cas, ça m'aide à comprendre un peu mieux ce que je fais ^^ parce que à force de tâtonner on en oubli les bases parfois :p
    Merci encore pour ton aide, peut être à une prochaine fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant]comparaison de table
    Par manshoon dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/06/2006, 17h49
  2. Comparaison entre tables
    Par Marmouz dans le forum Access
    Réponses: 3
    Dernier message: 13/04/2006, 16h21
  3. [SQL] vs [VBA] comparaison de tables et mise à jour
    Par borisa dans le forum VBA Access
    Réponses: 4
    Dernier message: 09/02/2006, 11h15
  4. accélérer la comparaison de tables
    Par mick84m dans le forum SQL Procédural
    Réponses: 16
    Dernier message: 10/12/2005, 13h06
  5. comparaison de tables
    Par amelie15 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/04/2005, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo