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

Création de vues


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    tunisie
    Inscrit en
    Novembre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : tunisie
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 19
    Points : 18
    Points
    18
    Par défaut Création de vues
    Bonjour;

    J'ai cette requête et j'ai créer toutes les vues qui lui concerne mais j'ai pas pu résolu cette partie :


    Requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
     from part, supplier, partsupp, nation, region where p_partkey = ps_partkey and s_suppkey = ps_suppkey and p_size = 1 and p_type like '%NICKEL' and s_nationkey = n_nationkey and n_regionkey = r_regionkey and r_name = 'AMERICA' and ps_supplycost = ( select min(ps_supplycost) from partsupp, supplier, nation, region where p_partkey = ps_partkey  and s_suppkey = ps_suppkey and s_nationkey = n_nationkey and n_regionkey = r_regionkey  and r_name = 'AMERICA' ) order by s_acctbal desc, n_name, s_name, p_partkey;
    Partie non résolu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps_supplycost = ( select min(ps_supplycost) from partsupp, supplier, nation, region where p_partkey = ps_partkey  and s_suppkey = ps_suppkey and s_nationkey = n_nationkey and n_regionkey = r_regionkey  and r_name = 'AMERICA' )
    J'ai créer cette vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Create view Q2_Project2 As select  min(ps_supplycost) from partsupp, supplier, nation, region ;
    mais il reste ça cette écriture est il vrai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Create view Q2_Filter4 As select * from  partsupp where  ps_supplycost = Q2_Project2 ;
    Merci

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Il y a 2 - 3 problèmes Babyy
    - la forme ancienne d'écriture des jointures (chercher sur le net : sql, select, inner join)
    - la vue Q2_Project2 est créée sans aucune jointure sur les tables
    ...
    Donc plutôt que d'en disserter
    Je propose de tester ceci

    1) Essai (benh oui je ne ne connais pas le MCD)
    - On vire la vue actuelle
    - on la recrée avec les bonne jointures ? entre les tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Create view Q2_Project2 As select min(ps_supplycost) as min_ps_supplycost from partsupp, supplier, nation, region where p_partkey = ps_partkey  and s_suppkey = ps_suppkey and s_nationkey = n_nationkey and n_regionkey = r_regionkey and r_name = 'AMERICA';
    - on vérifie que le résultat est correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select min_ps_supplycost from Q2_Project2
    2) Pour mieux comprendre les vues
    - On revire la vue actuelle
    - on la recrée avec les bonne jointures ? entre les tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Create view Q2_Project2 As select ps_supplycost,r_name from partsupp, supplier, nation, region where p_partkey = ps_partkey  and s_suppkey = ps_suppkey and s_nationkey = n_nationkey and n_regionkey = r_regionkey ;
    - on vérifie que le résultat est correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select min(ps_supplycost) from Q2_Project2 where r_name = 'AMERICA';
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par vttman Voir le message
    Il y a 2 - 3 problèmes Babyy
    - la forme ancienne d'écriture des jointures (chercher sur le net : sql, select, inner join)
    - la vue Q2_Project2 est créée sans aucune jointure sur les tables
    Tout à fait et aussi, l'une des fonctions des vues est de garantir l'indépendance des données vis à vis des traitements.
    Or, sur ce point, créer une vue avec "SELECT *" est une aberration car toute modification de la table aura un impact sur la requête !.
    Une vue ne doit JAMAIS utiliser SELECT * une requête non plus du reste, hors requete jetable.

    De plus, une requête doit être facile à comprendre pour permettre sa maintenance, il faut donc soigner la présentation, et utiliser des alias pour identifier clairement de quelle table vient telle colonne.
    Et enfin, comme mentionné par VTTMan, mais non appliqué dans sa proposition, les jointures se codent avec l'opérateur JOIN.
    Ce qui donnerait dans votre cas quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Create view Q2_Project2 As 
     
           select min(ps_supplycost) as min_ps_supplycost 
           from       partsupp as PS
           inner join supplier as SU
              on SU.s_suppkey = PS.ps_partkey 
           inner join nation   as NA
              on NA.n_nationkey = SU.s_nationkey
           inner join region   as RG 
              on RG.r_regionkey = NA.n_regionkey
           where r_name = 'AMERICA';
    Dernière remarque : il est très étrange que les clefs étrangères portent un nom différent de celui de la colonne de la table dont elle est issue. C'est très peu pratique !
    Ah non encore une remarque : filtrer sur une chaine de caractères est dangereux et peu performant. Dangereux car attention aux majuscules/minuscules, problèmes de collation et autres erreurs de saisie et peu performant car les colonnes char/varchar sont rarement indexées, et si index il y a, il est plus coûteux qu'un index sur un code ou un identifiant

    ATTENTION : j'ai repris les jointures telles qu'elles, sans savoir si elles sont utiles, d'ailleurs j'en doute. Sans description ni explication supplémentaire du demandeur, difficile de savoir quelles sont les tables vraiment utiles

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

Discussions similaires

  1. [UNIX][Optimisation] sur création de Vue
    Par dyvim dans le forum Oracle
    Réponses: 16
    Dernier message: 30/01/2006, 10h48
  2. [DROITS] création de vues matérialisées
    Par aline dans le forum Oracle
    Réponses: 6
    Dernier message: 26/12/2005, 17h36
  3. Réponses: 8
    Dernier message: 28/11/2005, 10h22
  4. alternative à la création de vues dans une procedure stockée
    Par cladsam dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/09/2005, 17h07
  5. Problème de création de vue.
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/02/2005, 15h14

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