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

Requêtes et SQL. Discussion :

Utilisation de la fonction TOP avec une jointure


Sujet :

Requêtes et SQL.

  1. #1
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut Utilisation de la fonction TOP avec une jointure
    Bonjour,

    Je rencontre des difficultés à écrire une requête.

    J'ai deux tables

    Table des Pays
    IdPays
    LibPays

    Table des villes
    IdVille
    LibVille
    IdPays

    J'ai besoin d'une requête qui me retourne pour chaque pays, les trois premières villes.

    Par exemple :
    FRANCE LYON MARSEILLE PARIS
    ITALIE ROME TURIN VENISE

    Je sèche.

    Merci

  2. #2
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Bonjour,
    Là pour l'instant, l'idée qui me vient à l'esprit c'est une fonction personnalisée avec requête.
    J'expose:
    1 Créer une fonction ayant comme paramètre l'IDPays et comme valeur de retour la liste des trois premières villes du pays représenté par IdPays. C'est donc une requête qui est à la base avec un recordset.
    2 Appeller cette fonction dans une autre requête qui affiche le pays et la liste de ses trois premières villes.
    ********************************************
    La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Public Function TroisVilles (IdPays As Long) As String
      Dim strVille As String
      Dim db As DAO.Database, rs As DAO.Recorset
      Set db=CurrentDb
      Set rs=db.OpenRecordset("SELECT TOP 3 LibVille FROM Ville WHERE IdPays=" & IdPays & ";",dbOpenDynaset)
      If rs.RecordCount<>0 Then
        rs.MoveFirst
        Do While Not rs.EOF
          strVille=strVille & "," & rs.Fields(0).Value
          rs.MoveNext
          DoEvents
        Loop
      End If
      If Len(Trim(strVille))<>0 Then
        strVille=Mid(strVille,2)
      End If
      TroisVilles=strVille
    End Function
    La requête SQL
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT LibPays, TroisVilles([IdPays]) As Villes FROM Pays;
    C'est peut-être pas brillant et assez lourd mais je crois que cela répond à ce sujet.
    Bon courage et @+

  3. #3
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    bon voici une solution qui utilise uniquement des requêtes SQL.

    Première requête : qryClassement
    permet de classer les villes par population pour chaque pays
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t_Villes.idPays, t_Villes.idVille, 
         t_Villes.LibVille, t_Villes.Population, 
         DCount("*","t_Villes","[idPays] =" & [idpays] & " And Population>=" & [Population]) AS Classement
    FROM t_Villes
    ORDER BY t_Villes.idPays, t_Villes.Population DESC;

    Ensuite une requête analyse croisée et hop tu obtiens tes trois premieres villes par pays dans trois champs, il ne te reste plus qu'à concaténer si besoin ...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TRANSFORM First(qryClassement.LibVille) AS PremierDeLibVille
    SELECT qryClassement.idPays, t_Pays.libPays
    FROM qryClassement INNER JOIN t_Pays ON qryClassement.idPays = t_Pays.idPays
    WHERE (((qryClassement.Classement)<="3"))
    GROUP BY qryClassement.idPays, t_Pays.libPays
    PIVOT qryClassement.Classement;

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour Caféine,

    j'avais proposé sur un autre forum une solution en une seule requete mais la tienne à le mérite d'être beaucoup beaucoup plus rapide

    Amicalement,

    Philippe

  5. #5
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Bonjour,
    @philben
    Peux-tu mettre ici le lien vers ce post?

    Citation Envoyé par philben
    bonjour Caféine,

    j'avais proposé sur un autre forum une solution en une seule requete mais la tienne à le mérite d'être beaucoup beaucoup plus rapide

    Amicalement,

    Philippe

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour Mahefasoa,

    le lien :
    http://www.developpez.net/forums/sho...d.php?t=370844

    En plaçant les Inner join en cascade on gagne un peu en rapidité je pense mais ça reste lent

    amicalement,

    Philippe

  7. #7
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Merci, Philippe

  8. #8
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Merci à tous

  9. #9
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Tu donnes une bonne solution, tout va dépendre du besoin


    Citation Envoyé par philben
    bonjour Caféine,

    j'avais proposé sur un autre forum une solution en une seule requete mais la tienne à le mérite d'être beaucoup beaucoup plus rapide

    Amicalement,

    Philippe

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2015, 14h55
  2. utilisation de la fonction Partdate() dans une requête
    Par jm6570 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/02/2010, 11h55
  3. Utilisation de la fonction replace() avec une regexp
    Par Ishizaki dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/08/2009, 17h39
  4. Est-il possible d'utiliser la fonction TOP avec un argument variable ?
    Par 16-Marco dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 06/03/2007, 22h21
  5. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17

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