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 :

Distinct ne fonctionne plus lors de jointures


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut Distinct ne fonctionne plus lors de jointures
    Salut,

    Je suis embêté car mon SQL est un peu rouillé, et je n'arrive pas à comprendre pourquoi mon DISTINCT (qui fonctionne bien sans jointure), n'a plus aucun effet (présence de doublons) lors de ma jointure !
    J'execute des requetes en direction de SQL Server.

    Voici ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT SOCIETE.NO_SOCIETE, SOCIETE.NOM, POSTAL.LATITUDE, POSTAL.LONGITUDE
    FROM SOCIETE
    INNER JOIN POSTAL ON POSTAL.CP = SOCIETE.CP
    ORDER BY SOCIETE.NO_SOCIETE
    Alors donc que celle la fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT SOCIETE.NO_SOCIETE, SOCIETE.NOM
    FROM SOCIETE
    ORDER BY SOCIETE.NO_SOCIETE
    Merci !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    DISTINCT s'applique sur l'ensemble des colonnes de la sélection.
    Vous devez avoir des différences entre vos lignes.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    D'après la requête, une société n'a qu'un seul code postal et à un code postal correspondent je pense une seule latitude et une seule longitude. Il ne devrait donc pas y avoir de doublons.

    Il doit y avoir des codes postaux en double, ce qui entraîne plusieurs lignes identiques.

    Analysez vos doublons pour comprendre leur cause.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut
    Tout a fait en fait les lignes sont différentes au niveau des coordonees geographique, ce qui prouve que le distinct s'applique à toute la ligne, et qu'il fonctionne donc bien.

    Seulement, ce que je voudrais c'est une seule ligne par SOCIETE_NO, peu importe les coordonnées retournées.
    Dois-je faire une requete imbriquée ? Une vue ?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Là je ne comprends plus !
    Tu peux donner la structure des tables STP ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Un agrégat par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT SOCIETE.NO_SOCIETE
           , SOCIETE.NOM
           , MAX(POSTAL.LATITUDE)  as LATITUDE
           , MAX(POSTAL.LONGITUDE) as LONGITUDE
        FROM SOCIETE
             INNER JOIN POSTAL
               ON POSTAL.CP = SOCIETE.CP
    GROUP BY SOCIETE.NO_SOCIETE
           , SOCIETE.NOM
    ORDER BY SOCIETE.NO_SOCIETE ASC;

  7. #7
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut
    Effectivement Waldar ta requete fonctionne !

    En realité dans ma base, le meme code postal est défini plusieurs fois dans la table POSTAL avec des coordonnées différentes...
    C'est pour ce que ca bug a la jointure seulement !

    Donc le distinct serait à faire sur le CP dans POSTAL et non l'id de l'entreprise !

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    En effet, un code postal correspond à un bureau distributeur, pas à une commune. Particulièrement dans les campagnes, plusieurs petites communes peuvent avoir un même bureau de poste chargé de la distribution... donc un même code postal !
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut
    Merci pour votre aide

    Cela dit maintenant :
    - On liste toutes les entreprises dont le code postal correspond à un ou plusieurs présents dans la table POSTAL. On peut donc avoir plusieurs resultats si le code postal est déclaré plusieurs fois.
    - On fait le MAX sur l'extraction de la latitude et longitude, donc après extraction des données

    N'y aurait-il pas la possibilité de faire un distinct directement à la BASE sur le code postal, au lieu d'utiliser les MAX sur latitude et longitude, ce qui sauvegarderai de la puissance de calcul (car j'ai environ 10 000 enregistrements)

    Je ne sais pas pourquoi mais le AS ne fonctionne pas (ne produit pas d'erreur, mais les colonnes ne sont pas nommées). Pour mes tests je travaille directement avec SQL Query avant d'importer tout ca dans excel.

    Merci!

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est bizarrement fait ton truc !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN POSTAL ON POSTAL.CP = SOCIETE.CP
    D'après ta requête, une société n'a qu'un code postal, soit le MCD suivant :

    SOCIETE -1,1----avoir----0,n- POSTAL

    Mais comme il peut y avoir plusieurs fois le même code postal dans POSTAL, la clé étrangère n'a pas une référence unique, ce qui est une anomalie de ton modèle et que le SGBD devrait interdire.

    Je vois que ton SGBD est SQL Server et je suis étonné qu'il laisse passer ça. Tu n'as pas programmé les contraintes de clés étrangères ?

    Du coup, comme tu ne veux qu'une seule ligne pour chaque société, donc une seule coordonnée géographique, on te suggère de prendre le MAX de la longitude et de la latitude, ce qui fait que ton entreprise sera positionnée à un angle du rectangle qui couvre l'ensemble de la zone couverte par le code postal. Cette coordonnée peut très bien se retrouver en dehors de cette zone !

    Bref, si ce n'est pas trop tard, tu ferais bien de revoir ton modèle de données car tu vas avoir des surprises à l'affichage du positionnement géographique des sociétés sur une carte !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Pour préciser la question de Cinéphil :
    Quelle est la clef primaire sur POSTAL ?
    Est-il possible de préciser le lien avec SOCIETE pour que ne corresponde plus qu'une ligne de POSTAL ?

    Sinon, pour qu'au moins on est une donnée cohérente (latitude + longitude), je suggérerais plutôt la solution analytique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT * 
    FROM (
      SELECT SOCIETE.NO_SOCIETE
           , SOCIETE.NOM
           , POSTAL.LATITUDE  
           , POSTAL.LONGITUDE
           , row_number() over(order partition by no_societe order by null) rk
        FROM SOCIETE
             INNER JOIN POSTAL
               ON POSTAL.CP = SOCIETE.CP
    ) t 
    WHERE rk = 1
    ORDER BY SOCIETE.NO_SOCIETE ASC;

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  12. #12
    Membre régulier Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Points : 86
    Points
    86
    Par défaut
    En fait c'est pas moi qui ait construit cette base, je suis censé l'exploiter sans avoir à toucher à sa structure, bien que je sois d'accord avec vous.

    En réalité la table postal contient un tas de champs, dont le code postal, mais aussi le code INSEE, et comme l'a justement dit al1_24, il peut y avoir plusieurs codes INSEE (plus précis) par bureau de distribution (code postal).
    C'est donc pour cette raison qu'on retrouve de multiples réponses pour un seul code postal!

    S'il existe donc 3 codes postaux indentiques, la latitude et la longitude se réfèrent au code INSEE pour situer le quartier plus précisément.
    Sauf que moi, le code INSEE je ne m'en sert pas dans cette application car dans je n'ai pas de champ dans ma table SOCIETE.
    Je peux donc prendre n'importe lequel des codes postaux, l'erreur de positionnement ne sera pas très grande, et comme je visualiserai à l'échelle régionale, ca n'aura aucun impact.

    Voilou

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2012, 11h57
  2. La localisation ne fonctionne plus lors du déploiement
    Par MaximePalmisano dans le forum ASP.NET
    Réponses: 0
    Dernier message: 29/09/2011, 15h32
  3. Réponses: 1
    Dernier message: 15/05/2010, 09h50
  4. Réponses: 13
    Dernier message: 20/07/2004, 08h54
  5. [JSP][Tomcat]Changement de context -> JSP fonctionne plus
    Par mathieu dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 01/03/2004, 08h01

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