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 :

Lire la première ligne d'une sous requette [Fait]


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 71
    Points : 57
    Points
    57
    Par défaut Lire la première ligne d'une sous requette
    Bonjour,

    La requete est sous Oracle 9 mais même un exemple non pl/sql m'irait bien. Je ne peux faire que des SELECT, c'est une base ou je ne peux rien créer.

    Soit une structure ou je compte le nombre de café ingurgité pour une personne

    T_PERS (ID, FKIDBureau, NOM)
    T_BUREAU (ID, FKIDService, NOM)
    T_SERVICE (ID, SERVICE)

    T_CAFE(ID, FKIDPers, Date)

    Liens:
    T_PERS.FKIDBureau ------ T_BUREAU.ID
    T_BUREAU.FKIDService ------ SERVICE .ID

    T_CAFE.FKIDPers ---- T_PERS.ID

    T_SERVICE
    ---------
    SER1 | Service 1
    SER2 | Service 2

    T_BUREAU
    -----------
    BUR1 | SER1 | Bureau 1
    BUR2 | SER1 | Bureau 2

    T_PERS
    ----------
    PERS1 | BUR1 | Personne 1
    PERS2 | BUR2 | Personne 2

    T_CAFE
    ----------
    CAFE1 | PERS1 | 12/02/2008
    CAFE2 | PERS1 | 13/02/2008
    CAFE3 | PERS1 | 14/02/2008
    CAFE4 | PERS2 | 15/02/2008

    Je voudrais pouvoir afficher la date de dernière prise de café avec les autres informations soit:

    Personne 1 | Bureau 1 | Service 1 | 14/02/2008
    Personne 2 | Bureau 2 | Service 1 | 15/02/2008

    Et non

    Personne 1 | Bureau 1 | Service 1 | 12/02/2008
    Personne 1 | Bureau 1 | Service 1 | 13/02/2008
    Personne 1 | Bureau 1 | Service 1 | 14/02/2008
    Personne 2 | Bureau 2 | Service 1 | 15/02/2008

    Merci pour les pistes ou la solution

    PS: J'ai essayé des sous requetes dans le where ou d'utiliser une requete comme table dans le from maissans succès.

    Un exemple de la requete mais qui ne fonctionne pas:

    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
    SELECT 
      T_PERS.NOM,
      T_BUREAU.NOM,
      T_SERVICE.SERVICE,
      DateDuDernierCafe
    FROM
      T_PERS,
      T_SERVICE,
      T_BUREAU,
      (SELECT * FROM 
                   (SELECT T_CAFE.ID, T_CAFE.DATE AS DateDuDernierCafe 
                    FROM T_CAFE 
                    ORDER BY T_CAFE.DATE DESC) 
        WHERE ROWNUM=1)
    WHERE
         T_PERS.FKIDBureau = T_BUREAU.ID 
    AND  T_BUREAU.FKIDService=T_SERVICE.ID

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    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
    WITH T_SERVICE AS ( SELECT 'SER1' ID, 'Service 1' Nom FROM dual
    UNION ALL  SELECT 'SER2' ID, 'Service 2' Nom FROM dual
    ),
    T_BUREAU AS ( SELECT 'BUR1' ID, 'SER1' FKIDService, 'Bureau 1' Nom FROM dual
    UNION ALL  SELECT 'BUR2' ID, 'SER1' FKIDService, 'Bureau 2' Nom FROM dual
    ),
    T_PERS AS ( SELECT 'PERS1' ID, 'BUR1' FKIDBureau, 'Personne 1' Nom FROM dual
    UNION ALL  SELECT 'PERS2' ID, 'BUR2' FKIDBureau, 'Personne 2' Nom FROM dual
    ),
    T_CAFE AS ( SELECT 'CAFE1' ID, 'PERS1' FKIDPers, '12/02/2008' as Date_c  FROM dual
    UNION ALL  SELECT 'CAFE2' ID, 'PERS1' FKIDPers, '13/02/2008' as Date_c FROM dual
    UNION ALL  SELECT 'CAFE3' ID, 'PERS1' FKIDPers, '14/02/2008' as Date_c FROM dual
    UNION ALL  SELECT 'CAFE4' ID, 'PERS2' FKIDPers, '15/02/2008' as Date_c FROM dual
    )
    SELECT DISTINCT p.nom, b.nom, s.nom, max(c.Date_c) over(partition BY p.id ) AS Date_c
    FROM T_CAFE c INNER JOIN T_PERS p ON p.id = c.FKIDPers
                                    INNER JOIN T_BUREAU b ON b.id = p.FKIDBureau
                                             INNER JOIN T_SERVICE s ON s.id = b.FKIDService
    Résultat :

    Personne 1 Bureau 1 Service 1 14/02/2008
    Personne 2 Bureau 2 Service 1 15/02/2008
    Dernière modification par Scorpi0 ; 24/11/2008 à 18h25.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    [QUOTE=Scorpi0;3810407]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T_PERS AS ( SELECT 'PERS1' ID, 'BUR1' FKIDBureau, 'Perso
    SELECT DISTINCT p.nom, b.nom, s.nom, max(c.Date_c) over(partition BY p.id ) AS Date_c
    FROM T_CAFE c INNER JOIN T_PERS p ON p.id = c.FKIDPers
                                    INNER JOIN T_BUREAU b ON b.id = p.FKIDBureau
                                             INNER JOIN T_SERVICE s ON s.id = b.FKIDService
    Superbe, en une requete j'ai découvert de nouvelles syntaxe SQL.
    Merci

    Une dernière question car j'avais simplifié la table t_cafe. Comment avec over(partition remonter plusieurs colonnes de la table T_CAFE) ? actuellement si T_Cafe contient aussi une colonne DateDeFin, j'ai des doublons sur les lignes.

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    [QUOTE=Magohamoths;3811093]
    Citation Envoyé par Scorpi0 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T_PERS AS ( SELECT 'PERS1' ID, 'BUR1' FKIDBureau, 'Perso
    SELECT DISTINCT p.nom, b.nom, s.nom, max(c.Date_c) over(partition BY p.id ) AS Date_c
    FROM T_CAFE c INNER JOIN T_PERS p ON p.id = c.FKIDPers
                                    INNER JOIN T_BUREAU b ON b.id = p.FKIDBureau
                                             INNER JOIN T_SERVICE s ON s.id = b.FKIDService
    Une dernière question car j'avais simplifié la table t_cafe. Comment avec over(partition remonter plusieurs colonnes de la table T_CAFE) ? actuellement si T_Cafe contient aussi une colonne DateDeFin, j'ai des doublons sur les lignes.

    Merci
    Je me réponds:
    Ajouter une autre colonne dans le select
    max(c.Date2_c) over(partition BY p.id ) AS Date2_c

  5. #5
    Scorpi0
    Invité(e)
    Par défaut
    Pour les fonctions analytiques, un tuto qui t'en apprendra encore beaucoup plus ici :

    http://lalystar.developpez.com/fonctionsAnalytiques/

    Amuses toi bien

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/04/2011, 19h49
  2. Selectionner première ligne d'une zone de liste
    Par bb62 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/07/2006, 10h49
  3. Désélectionner la première ligne d'une liste
    Par Mariboo dans le forum Access
    Réponses: 4
    Dernier message: 11/07/2006, 14h42
  4. fixer la première ligne d'une table
    Par lanfeust42 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/06/2006, 13h59
  5. [C# 2.0] Afficher les premières lignes d'une TextBox.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/06/2006, 19h25

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