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 PostgreSQL Discussion :

Problème de Vue..


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème de Vue..
    Bonjour,
    Voici la Structure de BD:
    Pièce jointe 85497

    Cette requette Récupere le classement d'une poole:

    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
    SELECT nation.nat_poule, nation.nat_nom,
    SUM( case when ((joue.nat_essai*5)+(joue.nat_trans*2)+(joue.nat_penal*3)+(joue.nat_drop*3)) > ((joue2.nat_essai*5)+(joue2.nat_trans*2)+(joue2.nat_penal*3)+(joue2.nat_drop*3)) then 1 else 0 end) AS Victoire
    FROM 
      public.joue 
      INNER JOIN public.nation ON nation.nat_id = joue.nat_id
      INNER JOIN public.joue joue2 ON joue.mat_id = joue2.mat_id 
                                   AND joue.nat_id <> joue2.nat_id
      INNER JOIN public.nation nation2 ON joue2.nat_id = nation2.nat_id
    WHERE
       nation.nat_poule = 'A'
    GROUP BY
      nation.nat_poule,
      nation.nat_nom
    ORDER BY
      nation.nat_poule,
      Victoire DESC
    J'ai Créer une Vue avec cette requette :

    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
    CREATE OR REPLACE VIEW classement (nat_poule, nat_nom, Victoire) AS (
    SELECT nation.nat_poule, nation.nat_nom,
    SUM( case when ((joue.nat_essai*5)+(joue.nat_trans*2)+(joue.nat_penal*3)+(joue.nat_drop*3)) > ((joue2.nat_essai*5)+(joue2.nat_trans*2)+(joue2.nat_penal*3)+(joue2.nat_drop*3)) then 1 else 0 end) AS Victoire
    FROM 
      public.joue 
      INNER JOIN public.nation ON nation.nat_id = joue.nat_id
      INNER JOIN public.joue joue2 ON joue.mat_id = joue2.mat_id 
                                   AND joue.nat_id <> joue2.nat_id
      INNER JOIN public.nation nation2 ON joue2.nat_id = nation2.nat_id
    WHERE
       nation.nat_poule = 'A'
    GROUP BY
      nation.nat_poule,
      nation.nat_nom
    ORDER BY
      nation.nat_poule,
      Victoire DESC
    );
    1. Quand j'ai exécuté cette vue il m'a dit (La requête a été exécutée avec succès en 42 ms, mais ne renvoie aucun résultat) Est-ce que c'est normal qu'elle ne renvoie rien.
    2. J'aimerais récuperer le premier nation de chaque poole j'ai pensé à faire un MAX de Victoire mais il accepte pas les fonctions imbriquées sinon j'ai pensé à utiliser la vue mais je ne sais pas comment je peux récupérer le MAX et Aussi comment lui passer des parametres

    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    qu'avez-vous utilisé comme requete pour tester votre vue ?
    logiquement un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from classement
    devrait fonctionner.

    Ensuite dans votre vue vous avez spécifié "nat_poule=A", sachez que vous pouvez aussi bien faire cette restriction en appelant votre vue. Donc je penses qu'il faudrait virer ceci.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci c'est bon ça marche ma vue.
    Maintenant je veux récupérer la liste des premiers de chaque poule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT c1.nat_poule,c1.nat_nom,c1.victoire
    FROM classement c1
    WHERE c1.victoire = (SELECT MAX(c2.victoire) FROM classement c2 WHERE c2.nat_poule = c1.nat_poule GROUP BY c2.nat_poule);
    J'ai fais ce code mais j'aimerai savoir si c'est saint ce code vue que dans ma table tous les MAX(victoire) = 4 Donc ce que je veux savoir si c'est l'utilisation de c1.nat_poule dans la requête imbriqué ne va pas crée de problème

    Merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    oui elle est bien, une autre approche qui évite d'utiliser 2 fois la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with tmp as(
    select nat_poule, nat_nom, victoire, 
    rank() over(partition by nat_poule order by victoire desc) as rnk
    from classement)
     
    select * 
    from tmp
    where rnk = 1
    il faudrait peut-être remonter la fonction de fenêtrage dans la vue ceci dit, ca éviterai de faire 2 fois le bouleau

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par punkoff Voir le message
    oui elle est bien, une autre approche qui évite d'utiliser 2 fois la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with tmp as(
    select nat_poule, nat_nom, victoire, 
    rank() over(partition by nat_poule order by victoire desc) as rnk
    from classement)
     
    select * 
    from tmp
    where rnk = 1
    il faudrait peut-être remonter la fonction de fenêtrage dans la vue ceci dit, ca éviterai de faire 2 fois le bouleau
    Merci c'est mieux comme approche mais j'ai une question pourquoi le rank quand il y a deux valeurs égales il leur donne le même rang et il donnez le rang+2 pour le prochain genre ( 1,2,2,4 ) est-ce logique

    Merci.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173

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

Discussions similaires

  1. Problème de vue
    Par tiyolx dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 27/11/2008, 09h44
  2. Envoie de Mail # Problème de vue
    Par captainflex dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 07/09/2008, 13h11
  3. Problèmes de vue indéxée
    Par The eye dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/03/2008, 00h25
  4. Problème de vue Datasheet sous sharepoint
    Par FiCuS dans le forum SharePoint
    Réponses: 1
    Dernier message: 23/10/2007, 11h04

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