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 :

Consolidation de deux vues [11g]


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Consolidation de deux vues
    Bonjour à tous
    J'ai besoin de votre aide pour créer une vue afin de rassembler des données:
    ma première vue "VIST_DATA" contient une liste des données par machine et par date
    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
    CREATE OR REPLACE FORCE VIEW "COSWIN"."VIST_DATA" ("EQUIPMENT", "DESCRIPTION", "LIGNE", "ZONE", "CRITIQUE", "FONCTION", "STATUS", "LEVEL_", "DATE_", "NUM_SEMAINE", "NUM_MOIS", "NUM_ANNEE", "T_OUVERTURE", "N_OT", "T_ARRET") AS 
      SELECT EREQ_CODE AS EQUIPMENT,
    	 ereq_description AS DESCRIPTION,
       EREQ_PARENT_EQUIPMENT AS LIGNE,
    	 EREQ_ZONE AS ZONE,
    	 ereq_boolean1 AS CRITIQUE,
    	 EREQ_CATEGORY AS FONCTION,
    	 EREQ_EQUIPMENT_STATUS AS STATUS,
          CASE 
                WHEN EREQ_LEVEL=1 THEN 'LIGN'
                WHEN EREQ_LEVEL=2 THEN 'EQUIPMENT'
                WHEN EREQ_LEVEL=3 THEN 'TOOLS'
                ELSE 'TEST'
          END
            AS LEVEL_,
       EQFR_DATE1 AS DATE_,
       TO_NUMBER (TO_CHAR (EQFR_DATE1, 'WW')) AS NUM_SEMAINE,
       TO_NUMBER (TO_CHAR (EQFR_DATE1, 'MM')) AS NUM_MOIS,
       TO_NUMBER (TO_CHAR (EQFR_DATE1, 'YYYY')) AS NUM_ANNEE,
       EQFR_NUMBER1 AS T_OUVERTURE,
    	 EQFR_NUMBER2 AS N_OT,
    	 EQFR_NUMBER3 AS T_ARRET
      FROM EQUIPMENT
        LEFT OUTER JOIN EQUIPMENT_FREE
                 ON EQUIPMENT.EREQ_CODE=EQUIPMENT_FREE.EQFR_EQUIPMENT
    WHERE EREQ_ENTITY='TPM' AND EREQ_EQUIPMENT_STATUS='N' and EREQ_LEVEL=2 AND EQFR_DATE1 >TO_DATE ('12/31/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
          ORDER BY EQUIPMENT,
                   DATE_ desc;
    la deuxième vue "VIST_LIGN" est pour but de faire une somme des temps d'ouverture par lignes car si je utilise une somme ordinaire donc le système va me faire une somme globale pour tous les machines par lignes alors que ce résultat est indésirable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      CREATE OR REPLACE FORCE VIEW "COSWIN"."VIST_LIGN" ("LIGNE", "DATE_", "TO_LIGNE", "NB_LIGNE") AS 
        select ligne,DATE_, sum(TO_LIGNE) TO_LIGNE, sum(NB) NB_LIGNE
    from
    ( select ligne, date_, MAX(t_ouverture) TO_LIGNE, count(*) NB
    from
    vist_data
    group by ligne, date_
    )
    group by ligne,DATE_
    order by date_ desc;
    Donc pour cet effet j'ai créé une requête afin de récupérer toutes les données des deux tables dans une seule vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l.ligne,d.EQUIPMENT,d.DESCRIPTION,d.LIGNE,d.ZONE,d.T_OUVERTURE, d.N_OT, l.to_ligne, d.date_
    FROM vist_data d, vist_lign l
    WHERE d.LIGNE = l.ligne and D.date_>TO_DATE ('05/07/2019 00:00:00', 'MM/DD/YYYY HH24:MI:SS') AND d.ligne IN ('CMS-LIGN-02','CMS-LIGN-05') 
    GROUP BY l.ligne,d.EQUIPMENT,d.DESCRIPTION,d.LIGNE,d.ZONE,d.T_OUVERTURE, d.N_OT, l.to_ligne, d.date_;
    alors j'ai rencontré deux problèmes
    1) Temps d'exécution trop long
    2) Les données récupérées de la table vist_lign sont erronée
    3) les enregistrements ce multiple 33 fois par équipement et pour même date

    Est ce quelqu'un aurait une idée pour palier à ceci
    Merci d'avance de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par BTB_DOR Voir le message
    alors j'ai rencontré deux problèmes
    1) Temps d'exécution trop long
    2) Les données récupérées de la table vist_lign sont erronée
    3) les enregistrements ce multiple 33 fois par équipement et pour même date
    Traitons les 2 problèmes en 3 temps

    1) Temps d'exécution trop long
    Il y a de nombreuses raisons pour qu'un traitement soit long : volume, complexité, indexation, ...
    Et il y a une différence entre "trop long" et "anormalement long".
    Comment justifiez vous ce jugement ?

    2) Les données récupérées de la table vist_lign sont erronée
    Par le code que vous avez fourni vous devriez savoir que ce n'est pas une table mais une vue !
    En quoi les données sont erronées ?

    3) les enregistrements ce multiple 33 fois par équipement et pour même date
    ça c'est le jeu de la jointure : si l'une des 2 sources renvoie 3 fois une même valeur pour la condition de jointure et l'autre 11 fois alors on aura le produit cartésien des lignes à savoir 11*3.

    Allez assez chinoisé reprenons le code.

    Première requête : "COSWIN"."VIST_DATA"
    Quelques incohérences de code :
    1- un joli case rendu inutile par l'une des conditions dans le where
    2- en supposant que la convention de nommage des colonnes est
    * a- "EQFR_" pour les colonnes de la table EQUIPMENT_FREE
    * b- "EREQ_" pour les colonnes de la table EQUIPMENT
    * Alors l'outer join est rendu inutile par la condition sur la colonne de la table EQUIPMENT_FREE

    Deuxième requête : "COSWIN"."VIST_LIGN"
    Je n'ai pas compris l'objectif a atteindre lorsque vous dites :
    la deuxième vue "VIST_LIGN" est pour but de faire une somme des temps d'ouverture par lignes car si je utilise une somme ordinaire donc le système va me faire une somme globale pour tous les machines par lignes alors que ce résultat est indésirable
    En tous les cas faire le même regroupement entre la sous requête et la requête n'a pas de sens.
    Pouvez-vous reformuler la demande en suivant un exemple à base de tableau (données) ?

    En tous les cas c'est ici que la multiplication des lignes est flagrante : le regroupement étant fait par ligne ET par date

    Troisième requête
    Elle réutilise la deuxième requête ... on attendra d'avoir résolu ça avant.

    Ceci dit pourquoi demander un regroupement (group by) ?
    Si la 2ieme requête est regroupée par ligne ET par date pourquoi ne pas avoir mis cette double imposition dans la clause de jointure

    En attendant d'en savoir plus sur la 2ieme requête voici la ré-écriture :
    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
    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
    CREATE OR REPLACE FORCE VIEW COSWIN.VIST_DATA
    (EQUIPMENT, DESCRIPTION, LIGNE, ZONE, CRITIQUE, FONCTION, STATUS, LEVEL_, DATE_
    , NUM_SEMAINE, NUM_MOIS, NUM_ANNEE, T_OUVERTURE, N_OT, T_ARRET) AS 
      SELECT E.EREQ_CODE 								AS EQUIPMENT,
    	 E.EREQ_description 							AS DESCRIPTION,
    	 E.EREQ_PARENT_EQUIPMENT 						AS LIGNE,
    	 E.EREQ_ZONE 									AS ZONE,
    	 E.EREQ_boolean1 								AS CRITIQUE,
    	 E.EREQ_CATEGORY 								AS FONCTION,
    	 E.EREQ_EQUIPMENT_STATUS 						AS STATUS,
         'EQUIPMENT'									AS LEVEL_,
    	 EF.EQFR_DATE1 									AS DATE_,
    	 TO_NUMBER (TO_CHAR (EF.EQFR_DATE1, 'WW')) 		AS NUM_SEMAINE,
    	 TO_NUMBER (TO_CHAR (EF.EQFR_DATE1, 'MM'))		AS NUM_MOIS,
    	 TO_NUMBER (TO_CHAR (EF.EQFR_DATE1, 'YYYY')) 	AS NUM_ANNEE,
    	 EF.EQFR_NUMBER1 								AS T_OUVERTURE,
    	 EF.EQFR_NUMBER2 								AS N_OT,
    	 EF.EQFR_NUMBER3 								AS T_ARRET
      FROM 	EQUIPMENT E
    		INNER JOIN EQUIPMENT_FREE EF
    			ON E.EREQ_CODE=EF.EQFR_EQUIPMENT
    WHERE E.EREQ_ENTITY='TPM' 
    	AND E.EREQ_EQUIPMENT_STATUS='N' 
    	AND E.EREQ_LEVEL=2  /*2 = 'EQUIPMENT' */
    	AND EF.EQFR_DATE1 >TO_DATE ('12/31/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
    ORDER BY EQUIPMENT, DATE_ desc;
    /
     
    SELECT LIGNE , count(*) as "Nb lignes pas ligne de production"
    FROM COSWIN.VIST_DATA
    GROUP BY LIGNE;
    /
     
     
    CREATE OR REPLACE FORCE VIEW "COSWIN"."VIST_LIGN" ("LIGNE", "DATE_", "TO_LIGNE", "NB_LIGNE") AS 
    /*SELECT ligne,DATE_, sum(TO_LIGNE) TO_LIGNE, sum(NB) NB_LIGNE
    FROM
    	(*/ SELECT ligne, date_, MAX(t_ouverture) TO_LIGNE, count(*) NB
    	FROM vist_data
    	GROUP BY ligne, date_
    	/*)
    GROUP BY ligne,DATE_*/
    ORDER BY date_ DESC;			   
    /
     
    SELECT LIGNE , count(*) as "Nb lignes pas ligne de production"
    from COSWIN.VIST_LIGN
    GROUP BY LIGNE;
     
    /
     
     
    SELECT l.ligne,d.EQUIPMENT,d.DESCRIPTION,d.LIGNE,d.ZONE,d.T_OUVERTURE, d.N_OT, l.to_ligne, d.date_
    FROM 	vist_data d
    		INNER JOIN vist_lign l
    			ON d.LIGNE = l.ligne 
    			AND d.date_ = l.date_
    WHERE  d.date_ > TO_DATE ('05/07/2019 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    	AND d.ligne IN ('CMS-LIGN-02','CMS-LIGN-05')
    Le savoir est une nourriture qui exige des efforts.

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

Discussions similaires

  1. Synchroniser deux vues HandlerUtil
    Par croc14 dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 04/12/2009, 13h56
  2. Select sur deux vues
    Par noekolo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/11/2009, 22h10
  3. Comment trier entre deux vues
    Par Ledobs dans le forum SQL
    Réponses: 5
    Dernier message: 27/05/2009, 17h48
  4. Réponses: 3
    Dernier message: 07/05/2009, 10h31
  5. [MFC] Deux vues pour un document
    Par Lark dans le forum MFC
    Réponses: 6
    Dernier message: 15/09/2004, 10h44

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