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

SQL Oracle Discussion :

Générer des requêtes imbriqués


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Générer des requêtes imbriqués
    Nom : MCD Merise_.jpg
Affichages : 91
Taille : 63,9 Ko

    Bonjour,

    Je suis débutant en oracle et je suis entrain d'essayer de générer des requêtes SQL3 depuis un MCD Merise
    J'aimerais avoir votre avis sur la construction de mes requêtes imbriqués en SQL3 et si elles correspondent bien à mon schéma.

    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
     
     
    CREATE TYPE article_type AS OBJECT (idA CHAR(10), nomA CHAR(10), prixA CHAR(10) )  
     
    CREATE TYPE facture_type AS OBJECT (idF CHAR(10), dateFact DATE) 
     
    CREATE TYPE ens_collection_fact AS OBJECT (refFact facture_type, refArticle article_type) 
     
    CREATE TYPE collection_fact AS TABLE OF ens_collection_fact 
     
    CREATE TYPE client_type AS OBJECT (idC NUMBER, nomC CHAR(10),adresse CHAR(10), Compose collection_fact ) 
     
    CREATE TABLE Article OF article_type 
     
    CREATE TABLE Facture OF facture_type 
     
    CREATE TABLE Client OF client_type (PRIMARY KEY(idC)) NESTED TABLE Compose STORE AS temp
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Pourquoi as-tu créé des types?
    Sous Oracle, quand on crée une table c'est en général comme ça qu'on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE TEST (ID NUMBER(9), NOM VARCHAR2(50),...);
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonjour,

    Tout d'abord votre MCD n'est pas réalisé correctement ; voici à quoi il devrait plutôt ressembler :
    Nom : MCD johnrayan.jpg
Affichages : 76
Taille : 16,1 Ko
    Par ailleurs, comme indiqué par Ikebukuro, je ne vois pas l'intérêt de définir des types.

    Dans l'exemple ci-dessus, le logiciel de modélisation (Looping dans ce cas) génère automatiquement le code SQL suivant (par exemple, pour MySQL) :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    CREATE TABLE Client(   Idc INT AUTO_INCREMENT,
       Nom VARCHAR(50),
       Adresse VARCHAR(80),
       PRIMARY KEY(Idc)
    );
     
     
    CREATE TABLE Facture(
       Idf CHAR(10),
       Date_ DATE,
       Idc INT NOT NULL,
       PRIMARY KEY(Idf),
       FOREIGN KEY(Idc) REFERENCES Client(Idc)
    );
     
     
    CREATE TABLE Article(
       Ida CHAR(10),
       Désignation VARCHAR(50),
       Prix DECIMAL(19,4),
       PRIMARY KEY(Ida)
    );
     
     
    CREATE TABLE Composer(
       Idf CHAR(10),
       Ida CHAR(10),
       Qté INT,
       PRIMARY KEY(Idf, Ida),
       FOREIGN KEY(Idf) REFERENCES Facture(Idf),
       FOREIGN KEY(Ida) REFERENCES Article(Ida)
    );
    Bonne continuation !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Dans le cas le plus général, commande et facture sont deux notions distinctes, il faut une cardinalité minimale de zéro de client vers facture, certains clients peuvent avoir déjà commandé mais n'ont pas encore été facturés

    Toujours dans le cas général, une commande peut concerner plusieurs articles, il faut donc ajouter la ligne de commande en lien avec l'article.

    Ce qui donne le modèle suivant, également réalisé avec Looping :

    Pièce jointe 593744

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Et si on est dans le cas d'une facturation à la fin du mois (assez courant pour les clients personne morales) et de commandes pouvant être livrées en une ou plusieurs fois, alors on obtient ceci

    Pièce jointe 593788

    Et le script correspondant pour Oracle :
    Code SQL : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    CREATE TABLE CL_client(
       CL_ident NUMBER(10),
       CL_nom VARCHAR2(50) NOT NULL,
       PRIMARY KEY(CL_ident)
    );
     
    CREATE TABLE CO_commande(
       CO_ident NUMBER(10),
       CO_date DATE NOT NULL,
       CL_ident NUMBER(10) NOT NULL,
       PRIMARY KEY(CO_ident),
       FOREIGN KEY(CL_ident) REFERENCES CL_client(CL_ident)
    );
     
    CREATE TABLE AR_article(
       AR_ident NUMBER(10),
       AR_reference CHAR(8) NOT NULL,
       AR_designation VARCHAR2(50) NOT NULL,
       PRIMARY KEY(AR_ident),
       UNIQUE(AR_reference)
    );
     
    CREATE TABLE FA_facture(
       FA_ident NUMBER(10),
       FA_date DATE NOT NULL,
       CL_ident NUMBER(10) NOT NULL,
       PRIMARY KEY(FA_ident),
       FOREIGN KEY(CL_ident) REFERENCES CL_client(CL_ident)
    );
     
    CREATE TABLE LI_livraison(
       LI_ident NUMBER(10),
       LL_date DATE NOT NULL,
       CL_ident NUMBER(10) NOT NULL,
       FA_ident NUMBER(10),
       PRIMARY KEY(LI_ident),
       FOREIGN KEY(CL_ident) REFERENCES CL_client(CL_ident),
       FOREIGN KEY(FA_ident) REFERENCES FA_facture(FA_ident)
    );
     
    CREATE TABLE LC_ligne_cde(
       CO_ident NUMBER(10),
       LC_ident NUMBER(10),
       LC_qte NUMBER(9,2) NOT NULL,
       AR_ident NUMBER(10) NOT NULL,
       PRIMARY KEY(CO_ident, LC_ident),
       FOREIGN KEY(CO_ident) REFERENCES CO_commande(CO_ident),
       FOREIGN KEY(AR_ident) REFERENCES AR_article(AR_ident)
    );
     
    CREATE TABLE LL_ligne_livr(
       LI_ident NUMBER(10),
       LL_ident NUMBER(10),
       LL_qte NUMBER(9,2) NOT NULL,
       CO_ident NUMBER(10) NOT NULL,
       LC_ident NUMBER(10) NOT NULL,
       PRIMARY KEY(LI_ident, LL_ident),
       FOREIGN KEY(LI_ident) REFERENCES LI_livraison(LI_ident),
       FOREIGN KEY(CO_ident, LC_ident) REFERENCES LC_ligne_cde(CO_ident, LC_ident)
    );

    En réalité il faudrait lier les lignes factures que je n'ai pas modélisées ici aux lignes de livraison

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

Discussions similaires

  1. SQL Postgres - Générer des sous requêtes dans une boucle
    Par olivierandré dans le forum Langage SQL
    Réponses: 8
    Dernier message: 20/06/2020, 15h30
  2. Interface graphique pour générer des requêtes SPARQL
    Par SonyBlack dans le forum SPARQL
    Réponses: 2
    Dernier message: 16/08/2010, 14h11
  3. générer des donnees / aide pour requête complexe
    Par djinnwatcher dans le forum Débuter
    Réponses: 7
    Dernier message: 10/08/2009, 13h56
  4. Réponses: 3
    Dernier message: 04/05/2009, 12h35
  5. générer des n° de lignes dans le résultat d'une requête
    Par karimspace dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/09/2007, 20h33

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