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

Développement SQL Server Discussion :

Requete sql table ayant plusieurs valeurs pour une clé, récupérer seulement la première


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut Requete sql table ayant plusieurs valeurs pour une clé, récupérer seulement la première
    Bonjour,

    J'ai une table avec une clé étrangère (integer) et un libellé...
    Je peux avoir plusieurs libellé pour une même clé étrangère...

    Exemple
    Id lib
    ----- -----
    1 Email
    1 telephone
    1 adresse
    2 geocodage
    2 zanzibar
    2 zizou
    3 gnawa
    3 fax


    Je cherche a faire une requète qui pour chaque clé étrangère, me renvoi seulement le premier résultat (et pas le second, ni les nième) de manière à obtenir une seule ligne par clé étrangère.

    Sur la table exemple, le résultat de ma requète serait:
    Id lib
    ---- -----
    1 Email
    2 geocodage
    3 gnawa


    Quelqu'un saurait-il comment faire cela ? je cherche déjà depuis trés longtemps et là, aujourd'hui, j'en ai vraiment besoin...

    Merci pour votre aide
    Olysmar2

  2. #2
    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,

    Le premier selon quel classement ?
    par ordre alphabétique ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    Pas particulièrement
    J'ai besoin simplement d'obtenir cette liste
    Une idée ?

  4. #4
    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
    Vous parlez de "premier"...

    ça sous-entend un ordre, à moins que vous ne parliez du "premier qui tombe sous la main"

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    effectivement, le terme "premier" peut porter a confusion
    Alors on dit le "premier qui tombe sous la main", c'est à cela que je pense...
    Merci

  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
    hmm, alors vous pouvez prendre arbitrairement le premier par ordre alphabétique, ce qui donne une requête assez simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, MIN(lib)
    FROM LaTable
    GROUP BY Id

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    Merci pour votre réponse...
    Effectivement, j'y avais pensé et donc toutes mes excuses... il y a bien un ordre...
    Je voudrais le premier de la liste issue d'un "select *" de la table pour obtenir le premier qui a été inséré dans chaque table...
    Mes excuses si je n'ai pas été assez clair...

  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
    Alors pour cela, il faudrait une colonne contenant la date de création : les lignes n'ont pas d'ordre dans la table et un select ne vous renverra pas forcément en premier les lignes qui ont été insérées en premier...

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    a flute alors... Je vais voir alors...
    Question subsidiaire...
    Je sais crée un champ date qui a une valeur par défaut correspondant à la date de création de la ligne
    Peut on créer un champ date qui se met a jour automatiquement avec la date du jour à chaque update de la ligne ?*
    Merci bcp...

  10. #10
    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
    pour faire ça, il faut passer par un trigger...

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    MErci pour toutes vos réponses
    C kool

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    Je reprend cette discussion parce que, en fait, aprés réflexion, je n'ai pas résolu ma problèmatique...

    supposons la table suivante
    id ide email default date
    ---- ---- ------------------------------------- -------- ----------
    1 1 aaa@free.Fr False 2014-05-09 10:40:27.310
    2 2 bbb@free.fr True 2014-05-09 10:40:44.750
    3 3 cccc@free.fr False 2014-05-09 10:41:01.820
    4 3 ddd@free.fr True 2014-05-09 10:41:10.527
    5 3 eeee@free.fr False 2014-05-09 10:43:15.267

    je voudrais pour chaque "ide" une unique adresse email (la première) sur une requete qui pour chaque "ide", récupére dans l'ordre d'importance d'abord si le default est a true et ensuite la date la plus récente.

    le résultat serait
    1 aaa@free.Fr
    2 bbb@free.fr
    3 ddd@free.fr

    J'avoue que je ne vois pas comment faire cela dans une seul requete sans sous-requete pour que cela soit efficace...

    Merci pour votre aide...
    Sylo

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Salut,

    Tu peux envisager d'utiliser les fonctions Window pour donner une séquence a tes lignes, en fonction de ton ordre d'importance.
    Puis filtrer sur la séquence 1.

    En gros, si j'ai bien compris ton besoin, cela devrait ressembler à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH CTE AS (
    	SELECT
    		ide, email,
    		ROW_NUMBER() OVER(PARTITION BY ide ORDER BY [default] DESC, [date] DESC) AS rownumber
    	FROM LaTable
    )
    SELECT
    	ide, email
    FROM CTE
    WHERE rownumber = 1

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    Cela m'a l'air pas mal, ça...
    Je ne connaissait pas.
    Je vais tester et je vous fait un retour
    Merci bcp

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 199
    Points : 70
    Points
    70
    Par défaut
    nickel !
    C'est pile ce que je cherchais

    une autre façon de l'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
    	ide, email
    FROM (	SELECT
    		ide, email,
    		ROW_NUMBER() OVER(PARTITION BY ide ORDER BY DEFAUT DESC, [dcr] DESC) AS rownumber
    	FROM test2) as tt
    WHERE rownumber = 1
    Merci
    Sylo

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/02/2009, 14h39
  2. [MySQL] Plusieurs valeurs pour une variable à injecter
    Par pony99 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/12/2008, 12h04
  3. Plusieurs valeurs pour une meme colonne
    Par Aragorn) dans le forum SQL
    Réponses: 4
    Dernier message: 03/01/2008, 14h46
  4. Plusieurs valeurs pour une même colonne
    Par maxlegrand dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/10/2007, 13h32
  5. [Tableaux] Plusieurs valeurs pour une seule CheckBox
    Par Phenol dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2007, 17h54

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