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 :

Ramener les n premières lignes dynamiquement


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 14
    Points : 23
    Points
    23
    Par défaut Ramener les n premières lignes dynamiquement
    Bonjour,

    Je me casse les dent sur le problème suivant:

    J'ai une table STATUT avec colonne projet, A, B
    J'ai une table SETTING avec une colonne projet priorite, projet, C, D

    Dans ma table SETTING, j'ai une et une seule ligne pour chaque projet, chaque projet a une priorite donnée en entier

    Dans la table STATUT j'ai pleins de lignes pour chaque projet.

    Je voudrais faire une requête qui me rapporte les priorite première lignes de chaque projet dans la table STATUT

    Je pensais faire un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT STATUT.projet, A, B FROM STATUT, SETTING WHERE STATUT.projet = SETTING.projet LIMIT SETTING.priorite
    mais cela ne passe pas, je suis sous sqlite, des idées pour cette problématique

    bizarrement il me dit qu'il ne connait pas SETTING.priorite, alors que si je fais select SETTING.priorite from SETTING.priorite j'ai bien une réponse.

    Bon, Sqlite a des limitations, mais si quelqu'un a des idées, le sql c'est pas mon fort :-)

    A+

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    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 106
    Points : 28 394
    Points
    28 394
    Par défaut
    La clause LIMIT n'existe pas dans le langage SQL normatif. Toutefois, dans les SGBD qui l'implémentent, celle-ci n'accepte que des constantes. A ce niveau là, les colonnes de la requête sont inconnues.

    Pour lister les n premières lignes, il faut commencer par définir l'ordre dans lequel ces lignes sont triées, ce qui n'apparait pas dans la requête actuelle.
    C'est la place de la ligne en fonction de cet ordre qu'il faudra comparer à la priorité.
    En SQL normatif, cela donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH    stt
        AS  (   SELECT  *
                    ,   ROW_NUMBER()  OVER (ORDER BY colonne_de_tri PARTITION BY projet) AS  ordre
                FROM    statut
            )
    SELECT  stt.projet
        ,   A
        ,   B 
    FROM    stt
        INNER JOIN
            setting AS stg
            ON  stt.projet = stg.projet
    WHERE   stt.ordre <= stg.priorite

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    la norme c'est ,effectivement dans le ORDER BY , la clause FETCH qui accepte des sous requêtes.

    Exemple pour ramener la moitié du nombre de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   Matable
    ORDER BY uneColonne DESC OFFSET 0 ROWS FETCH NEXT (SELECT COUNT(*) / 2 FROM MaTable) ROWS ONLY
    La sous requête devant être scalaire.

    A +

Discussions similaires

  1. supprimer les 5 premières lignes d'une table
    Par jnmab dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/11/2008, 08h17
  2. Supprimer les x premières lignes
    Par gsacilot dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/10/2007, 22h51
  3. Réponses: 8
    Dernier message: 03/07/2007, 18h26
  4. Afficher les 10 premières lignes d'un rapport
    Par redoute dans le forum Deski
    Réponses: 4
    Dernier message: 20/04/2007, 16h02
  5. Récupérer les 50 premières lignes du requête
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/08/2006, 11h15

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