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 :

Requêtes SQL bizarres


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 21
    Points
    21
    Par défaut Requêtes SQL bizarres
    Bonsoir j’ai deux requêtes SQL sur les quelles je bloque (oui je suis débutant)

    1/ j’ai trois tables comme suit :

    Tab1 (ID1, Nom1, Prenom1)

    Tab2 (ID2, Prenom2, Date_Naissance, Sex)

    Tab3 (ID3, Nom3, Adresse, Sex)

    Je veux avoir

    Tab4 (ID4, Nom1, Prenom1, Date_Naissance, Adresse)

    J’ai essayé ça mais je ne suis pas sur de mon coup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select A.Nom1, A.Prenom1, B.Date_Naissance, C. Adresse
     from  Tab1 A
    inner joint Tab2 B on A. Prenom1 = B. Prenom2
    inner joint Tab3 C on  A.Nom1 =  C. Nom3
                                 and  B.Sex = C.Sex
    2/ J’ai une table qui contient plusieurs doublons et je veux récupérer que la ligne la plus récente

    Tab5 (ID5, Nom, Prenom, Adresse, Date_MAJ)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1, grant, lisa, 43 rue bla bla, 01/01/2001
    2, grant, lisa, 86 rue bla bla, 16/03/2005
    3, grant, lisa, 7 bis rue bla bla, 27/08/2010
    4, mlou, toto, 28 BD titi, 28/07/1995
    5, mlou, toto, 205 BD titi, 15/10/2005
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3, grant, lisa, 7 bis rue bla bla, 27/08/2010
    5, mlou, toto, 205 BD titi, 15/10/2005
    D’avance merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Je pense qu'il y a un énorme problème de conception dans votre base.

    Que fait-on quand 2 personnes ont le même prénom / nom / sexe ?

    Sinon ça m'a l'air correct si on fait fi du problème initial

    2/ J’ai une table qui contient plusieurs doublons et je veux récupérer que la ligne la plus récente
    Vous allez devoir passer par une sous-requête qui va faire un group-by sur l'id et prenne le min ou le max de la date pour récupérer l'ordre souhaiter de votre tri.
    Ensuite retrouvez les enregistrements initiaux avec ceci.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    à quoi correspondent les ID1, 2, 3, 4,...

    comme le dit punkoff, vous avez un énorme problème avec votre base, il faut donc que vous nous disiez exactement ce qui permet de faire le lien entre les différentes table (si j'en crois votre première requête, vous faite le lien entre la table1 et la table2... grâce au prénom !!! )

    et si j'en crois aussi votre exemple avec les doublons, vos ID ne servent a rien, car la même personne aurait des ID différents !

    Dites en nous un peu plus sur le contexte (est-ce une base déjà en production, ou êtes-vous en train de développer, quelle est l'origine des données,...), car je crois que vous avez des problèmes a résoudre en amont de celui que vous exposez ici !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    merci punkoff, aieeeuuuuu,
    alors oui la base est toute pourrie

    ReQ1:
    les tables n'ont aucun lien entre elles ... le but est depuis un nom et prénom récupérer le max d'informations (on cherche a créer une nouvelle table qui regroupe les informations).. oui effectivement je dois faire une jointure sur le prénom (ou le nom et prénom ... j'ai juste résumé un problème encore plus chiant)... les id ne servent à rien en dehors de la table elle même

    ReQ2:
    L'ID est issu d'une autre table contrats et vu qu'une personne peut avoir plusieurs contacts à des dates différentes on veut avoir la dernière adresse de la personne

    @punkoff: je ne vois pas comment faire la sous requête SVP une petite aide merci.
    je réédite pour répondre à ta question
    on prend la donnée la plus récente (la ReQ2 )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Merci tous

    pour la ReQ 2 j'ai fais celà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT X.ID, X.Nom, X.DONNEE, X.Date_Maj FROM dbo.TEST_MAX_LOAD X
    WHERE Date_Maj in (SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
    WHERE Y.Nom = X.Nom
    Group BY y.Nom)

    c'est ok

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par sql_bin Voir le message
    Merci tous

    pour la ReQ 2 j'ai fais celà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT X.ID, X.Nom, X.DONNEE, X.Date_Maj FROM dbo.TEST_MAX_LOAD X
    WHERE Date_Maj in (SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
    WHERE Y.Nom = X.Nom
    Group BY y.Nom)

    c'est ok
    avec le MAX(), votre sous requete ne renverra jamais plus d'une ligne, vous pouvez donc remplacer le IN par un =...

    Mais je pense que vous pouvez faire mieux a partir de cette requete, en remplacant votre sous requete par une pseudo table
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Nom, MAX(Date_Maj) AS MAX_DATE_MAJ
    FROM TEST_MAX_LOAD 
    GROUP BY Nom

    et en faisant une jointure sur la date (et sur le nom aussi bien sur !)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    @aieeeuuuuu: UN GRAND MERCI
    Mais le In me retourne deux lignes!! (voir mon exemple un peu plus haut)
    C'est quoi la différence entre les deux méthodes (la mienne et avec pseudo table) Merci.

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Code sql :

    SELECT max (Date_Maj)
    FROM dbo.TEST_MAX_LOAD



    Vous renvoie deux lignes ??????

    Quel est votre SGBDR, il va peut être falloir songer à en changer...

    pour ce qui est de la jointure, elle sera plus performante qu'avec une sous requete

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Oui elle me retourne deux ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
    --WHERE Y.Nom = X.Nom
    GROUP BY y.Nom
    Je suis sous SQL Server 2005

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Avec SQL-Server 2005 on écrit plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With Tab5_new (ID5, Nom, Prenom, Adresse, Date_MAJ, rn) as
    (
    select ID5, Nom, Prenom, Adresse, Date_MAJ,
           row_number() over(partition by Nom order by Date_MAJ desc)
      from Tab5
    )
    select ID5, Nom, Prenom, Adresse, Date_MAJ
      from Tab5
     where rn = 1

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par sql_bin Voir le message
    Oui elle me retourne deux ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
    --WHERE Y.Nom = X.Nom
    GROUP BY y.Nom
    Je suis sous SQL Server 2005

    Arff, désolé, je n'avais pas vu que le GROUP BY faisait partie de la sous requête, d'ailleurs je ne comprend pas trop son intérêt, car vous filtrez déjà par nom, et s'il vous renvoie plus d'une ligne, c'est que vous avez plusieurs prénoms pour un seul et même nom, vous devriez donc ajouter un Y.prenom = X.Prenom dans la clause WHERE de votre sous requête, sinon vous aurez des résultats erronés...

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. Résultat requête SQL bizarre !
    Par ulspider dans le forum Hibernate
    Réponses: 0
    Dernier message: 18/01/2013, 18h12
  3. [MySQL] requête sql dans 2 bases, champ bizarre, trie spécial, ouf !
    Par maxence64 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/06/2011, 19h23
  4. Caractères bizarres dans requête SQL
    Par onizuka-21 dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 31/03/2009, 18h34
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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