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 :

Connaître la position des éléments d'une sous sélection, dans une sélection principale


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut Connaître la position des éléments d'une sous sélection, dans une sélection principale
    Bonjour,

    Désolé pour le titre pas très clair, ce n'est pas évident de résumer certains problèmes en quelques mots !

    Mon problème est le suivant...
    - j'ai une table "Teams" contenant une liste de noms: colonnes "ID" et "Name"
    - j'ai une table de jonction "TeamsMap" qui associe ces ID à d'autres données via la colonne "TeamExt": colonnes "ID", "TeamInt", "TeamExt"

    Certaines entrées de ma table "Teams" sont absentes de la table de jonction, je récupère leur liste par la requête (B):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t.ID, t.Name
    FROM Teams AS t
    LEFT OUTER JOIN TeamsMap AS tm ON tm.TeamExt = t.ID
    WHERE tm.ID IS NULL
    Ma question est: comment connaître la position de chaque ligne retournée par la requête (B), dans la requête générale (A) suivante ?
    Ex:
    - si (A) retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID	Name
    45	ARGENTAN
    98	BLAU WEISS BERLIN
    99	BLENOD
    121	BREST
    127	BRUNSWICK
    147	CASTETS
    - et si (B) retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID	Name
    99	BLENOD
    127	BRUNSWICK
    Quelle requête me permettrait d'obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID	Name		Position
    99	BLENOD		3
    127	BRUNSWICK	5
    Est-ce possible au moins ?

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    La position est déterminée, je suppose par l'ordre croissant de ID ?

    Dans la sous-requête (A) il faut utiliser une fonction : row_number, rank, ... (suivant votre SGBD).
    ~ Lola ~

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Pour l'instant les deux requêtes affichent par ordre croissant d'ID puisqu'il n'y a pas de tri spécifié, mais je pourrais avoir besoin d'afficher par ordre alphabétique sur la colonne Name.
    J'utilise SQlite, je vais chercher des infos sur rank/row_number...

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Avec des sous-requêtes :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select b.id, b.name, COUNT(*)
    from b
    inner a on a.id <= b.id
    group by b.id;

    Ce qui donnerait avec vos données :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select b.id, b.name, count(*)
    from Teams
    inner join 
    (SELECT t.ID
    FROM Teams AS t
    LEFT OUTER JOIN TeamsMap AS tm ON tm.TeamExt = t.ID
    WHERE tm.ID IS NULL) as a on a.id <= b.id
    group by b.id

    Après, je pense qu'on peut se passer du sous-select, mais il faudra peut-être adapter (pas testé) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select b.id, b.name, count(*)
    from Teams b
    inner join (Teams AS t
    LEFT OUTER JOIN TeamsMap AS tm ON tm.TeamExt = t.ID
    WHERE tm.ID IS NULL) on t.id <= b.id
    group by b.id
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Pour l'instant les deux requêtes affichent par ordre croissant d'ID puisqu'il n'y a pas de tri spécifié,
    Sans clause ORDER BY explicite il n'y a aucun tri, même si l'affichage de 5 lignes peuvent laisser penser le contraire.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Alors... d'abord row_number et rank n'existent pas sous SQLite, et il n'y a pas d'équivalent.

    Ensuite, @StringBuilder: hmm, il y a un début de quelque chose, mais, non ça ne marche pas. Si je reprends mon exemple, la deuxième requête donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    b.id	b.name			count(*)
    99	BLENOD			1
    121	BREST			1
    127	BRUNSWICK		2
    147	CASTETS			2
    (La troisième ne marche pas)

    Je vais peut-être m'y prendre autrement dans mon code...
    Pour faire plus simple, y-a-t-il une requête qui puisse retourner le numéro d'une ligne dans une table ? Ex, en partant de "BLAU WEISS BERLIN", je devrais obtenir "2" dans la table de départ (ou 1 si le premier élément est compté comme 0).

  7. #7
    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
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        select t1.ID, t1.Name, COUNT(*) as Position
          from Teams AS t1
    inner join Teams AS t2
            on t2.Id <= t1.Id
      group by t1.ID, t1.Name
        having not exists (select null
                             from TeamsMap AS tm
                            where tm.TeamExt = t1.ID);
     
    ID          Name              Position
    ----------- ----------------- -----------
    99          BLENOD            3
    127         BRUNSWICK         5

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Magnifique, on dirait bien que ça fonctionne !

    Mais wow, j'ai beau la retourner dans tous les sens, je ne comprends pas comment - ça fonctionne ! Bravo, je suis épaté !

    Merci à tous ceux qui sont intervenus.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. Réponses: 3
    Dernier message: 03/09/2007, 09h35
  3. je cherche une sous chaine dans une chaine
    Par avprive dans le forum C++
    Réponses: 3
    Dernier message: 17/03/2005, 01h48
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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