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 :

Créer une vue affichant les champs modifiés sur des tables d'historisation


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut Créer une vue affichant les champs modifiés sur des tables d'historisation
    Bonjour,

    Pourriez-vous m'aider concernant l'élaboration d'une vue en SQL sur une base de données contennat des tables d'historisation? Je ne sais pas trop comment m'y prendre pour que ce soit le plus efficace possible

    Voici le Contexte:

    Mon application permet de gérer des contrats (un contrat contient un ensemble d'informations générales et est lié à des contacts, des "legal references" et des portfolios). Quand une mise à jour est réalisée, une nouvelle entrée est insérée dans les tables d'historisation. Si une modification est faite sur les contacts, legal reference ou portfolio, une nouvelle ligne est également ajoutée dans la table contrat_HIST.

    Mon objectif est de créér une vue qui me permettrait sur base des différentes tables d'historisation d'afficher les mises à jour (par rapport à un ID HIST donné).

    Je souhaiterais avoir quelque chose comme cela:

    Nom : Cap.PNG
Affichages : 413
Taille : 18,9 Ko

    Ainsi pour chaque nouvelle mise à jour (à une date t grâce à ID HIST), on peut savoir si ce sont les données générales, les contacts, les légales références ou/et les activités qui ont été mis à jour.

    Voici la structure des tables de ma base de données:

    Table contrat HIST (informations générales)

    ID HIST Date Creation ID Contrat Titre Contrat Description Budget
    1 01/01/2015 1 Contrat 1 Contrat Informatique 20 000
    2 15/01/2015 1 Contrat 1 Contrat Informatique 50 000
    3 02/02/2015 2 Contrat 2 Contrat Santé 10 000
    4 01/03/2015 2 Contrat 2 Contrat Consommateur 30 000
    5 01/07/2015 1 Contrat 1 Contrat Informatique 50 000

    Table contact HIST (liaison avec les contacts)

    ID HIST ID Contrat Contact name
    1 1 Bernard
    1 1 Jean
    2 1 Nicolas
    2 1 Jean
    3 2 Nicolas
    5 2 Nicolas

    Table Legal Refrence HIST (liaison avec les Legal Reference)

    ID HIST ID Contrat LegalRef name
    1 1 45 - Technologies et Systeme d'Information
    3 2 105 - Consommateur et Santé
    5 1 27 - Services

    Table Portfolio HIST (liaison avec les Portfolios)

    ID HIST ID Contrat ID Portfolio Portfolio name Portfolio Value
    2 1 1 Portfolio 1 5000
    2 1 2 Portfolio 2 7000
    4 2 1 Portfolio 1 2000
    4 2 2 Portfolio 2 8000

    Ainsi je souhaiterais avec cette vue avoir cela:


    ID Contrat ID HIST Date Creation GENERAL INFO CONTACT LEGAL REFERENCE PORTFOLIO
    1 1 01/01/2015 Updated Updated Updated No Update
    1 2 15/01/2015 Updated Updated Updated Updated
    1 5 01/07/2015 No Update Updated Updated No Update
    2 3 02/02/2015 Updated Updated No Update No Update
    2 4 01/03/2015 Updated No Update No Update Updated


    Je joints ici les scripts pour la BDD:

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    --------------------------------------------------------
    --  DDL for Table CONTACT_HIST
    --------------------------------------------------------
     
      CREATE TABLE "CONTACT_HIST" 
       (	"ID_HIST" NUMBER, 
    	"ID_CONTRAT" NUMBER, 
    	"NAME_CONTACT" VARCHAR2(20 BYTE)
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "RAM" ;
    REM INSERTING into BO.CONTACT_HIST
    SET DEFINE OFF;
    Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (1,1,'Bernard');
    Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (1,1,'Jean');
    Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (2,1,'Nicolas');
    Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (2,1,'Jean');
    Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (3,2,'Nicolas');
    Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (5,2,'Nicolas');
     
    --------------------------------------------------------
    --  DDL for Table CONTRAT_HIST
    --------------------------------------------------------
     
      CREATE TABLE "BO"."CONTRAT_HIST" 
       (	"ID_HIST" NUMBER, 
    	"DATE_CREATION" DATE, 
    	"ID_CONTRAT" NUMBER, 
    	"TITRE_CONTRAT" VARCHAR2(250 BYTE), 
    	"DESCRIPTION" VARCHAR2(250 BYTE), 
    	"BUDGET" NUMBER
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "RAM" ;
    REM INSERTING into BO.CONTRAT_HIST
    SET DEFINE OFF;
    Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (1,to_date('01-JAN-15','DD-MON-RR'),1,'Contrat 1 ','Contrat Informatique ',20000);
    Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (2,to_date('15-JAN-15','DD-MON-RR'),1,'Contrat 1 ','Contrat Informatique ',50000);
    Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (3,to_date('02-FEB-15','DD-MON-RR'),2,'Contrat 2 ','Contrat Santé ',10000);
    Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (4,to_date('01-MAR-15','DD-MON-RR'),2,'Contrat 2 ','Contrat Consommateur ',30000);
    Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (5,to_date('01-JUL-15','DD-MON-RR'),1,'Contrat 1 ','Contrat Informatique ',50000);
    --------------------------------------------------------
    --  DDL for Index CONTRAT_HIST_PK
    --------------------------------------------------------
     
      CREATE UNIQUE INDEX "BO"."CONTRAT_HIST_PK" ON "BO"."CONTRAT_HIST" ("ID_HIST") 
      PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "RAM" ;
    --------------------------------------------------------
    --  Constraints for Table CONTRAT_HIST
    --------------------------------------------------------
     
      ALTER TABLE "BO"."CONTRAT_HIST" ADD CONSTRAINT "CONTRAT_HIST_PK" PRIMARY KEY ("ID_HIST")
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "RAM"  ENABLE;
      ALTER TABLE "BO"."CONTRAT_HIST" MODIFY ("ID_HIST" NOT NULL ENABLE);
     
    --------------------------------------------------------
    --  DDL for Table LEGAL_REFERENCE_HIST
    --------------------------------------------------------
     
      CREATE TABLE "BO"."LEGAL_REFERENCE_HIST" 
       (	"ID_HIST" NUMBER, 
    	"ID_CONTRAT" NUMBER, 
    	"LEG_REF_NAME" VARCHAR2(250 BYTE)
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "RAM" ;
    REM INSERTING into BO.LEGAL_REFERENCE_HIST
    SET DEFINE OFF;
    Insert into BO.LEGAL_REFERENCE_HIST (ID_HIST,ID_CONTRAT,LEG_REF_NAME) values (1,1,'45 - Technologies et Systeme d''Information');
    Insert into BO.LEGAL_REFERENCE_HIST (ID_HIST,ID_CONTRAT,LEG_REF_NAME) values (3,2,'105 - Consommateur et Santé');
    Insert into BO.LEGAL_REFERENCE_HIST (ID_HIST,ID_CONTRAT,LEG_REF_NAME) values (5,1,'27 - Services');
     
    --------------------------------------------------------
    --  DDL for Table PORTFOLIO_HIST
    --------------------------------------------------------
     
      CREATE TABLE "BO"."PORTFOLIO_HIST" 
       (	"ID_HIST" NUMBER, 
    	"ID_CONTRAT" NUMBER, 
    	"PORTFOLIO_ID" NUMBER, 
    	"PORTFOLIO_NAME" VARCHAR2(250 BYTE), 
    	"PORTFOLIO_VALUE" NUMBER
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "RAM" ;
    REM INSERTING into BO.PORTFOLIO_HIST
    SET DEFINE OFF;
    Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (2,1,1,'Portfolio 1',5000);
    Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (2,1,2,'Portfolio 2',7000);
    Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (4,2,1,'Portfolio 1',2000);
    Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (4,2,2,'Portfolio 2',8000);
    commit;

    Merci d'avance pour votre aide.

    Seb

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je pense que vos données dans contact_hist sont fausses, les ID_HIST et les ID_CONTRAT ne sont pas les mêmes que dans la table contrat_HIST.
    Il manque aussi un id_contact dans cette table.

    Essayez de présenter vos données sous forme de create table + insert, ça permet à tout le monde de tester.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je pense que vos données dans contact_hist sont fausses, les ID_HIST et les ID_CONTRAT ne sont pas les mêmes que dans la table contrat_HIST.
    Il manque aussi un id_contact dans cette table.

    Essayez de présenter vos données sous forme de create table + insert, ça permet à tout le monde de tester.
    Les données sont correctes, un contrat peut avoir 0 ou plusieurs contacts. Chaque fois qu'il y a une modification au niveau des contacts d'un contrat, on réinsère dans la tables contacts_hist les liens.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Si je comprends bien, chacune des 3 tables historiques est facultative, et un occurrence n'est créée que si les modification faites à un instant "t" dans un contrat la concerne.
    Du coup il faut faire une jointure full outer join entre les 3 tables historique et mettre en forme les "updated" / "not/updated" avec des case

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Un truc de ce genre du coup :
    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
       SELECT COALESCE(GE.ID_Contrat, CO.ID_Contrat, LG.ID_Contrat, PF.ID_Contrat)
             ,CASE
                 WHEN GE.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_GE
             ,CASE
                 WHEN CO.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_CO
             ,CASE
                 WHEN LG.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_LG
             ,CASE
                 WHEN PF.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_PF
       FROM contrat_HIST as GE
       FULL OUTER JOIN contact_HIST as CO
         ON CO.ID_Contrat = GE.ID_Contrat
       FULL OUTER JOIN Legal_Refrence_HIST as LG
         ON LG.ID_Contrat = GE.ID_Contrat
       FULL OUTER JOIN Portfolio_HIST as PF
         ON PF.ID_Contrat = GE.ID_Contrat
    En espérant que les tables ne sont pas trop volumineuses, car full outer join sur 4 tables ca risque de dépoter !

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    En espérant que les tables ne sont pas trop volumineuses, car full outer join sur 4 tables ca risque de dépoter !
    Cela a plus l'air mythologique que réel. Pour ne pas dire que "volumineuse" signifie tout et n'importe quoi!

  7. #7
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Essayez de présenter vos données sous forme de create table + insert, ça permet à tout le monde de tester.
    J'ai ajouté les scripts pour tester

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    En dessous de quelques millions de ligne par table, on a rarement des soucis, (hors requête mal construite ou problème de contexte bien sur)
    ici, on a 4 occurrences maxi par mise à jour, si la màj concerne les 4 tables donc 4 fois plus qu'avec une requete inner

    Dans un contexte plus général, alors qu'une requete inner ne ramène que l'effectif de l'intersection avec outer on a toutes les combinaisons.
    Ce n'est donc pas mythologique, mais mathématique

    A ceci, on ajoute qu'il n'y a pas de filtrage, puisque c'est tout l'historique qui est demandé

  9. #9
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Un truc de ce genre du coup :
    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
       SELECT COALESCE(GE.ID_Contrat, CO.ID_Contrat, LG.ID_Contrat, PF.ID_Contrat)
             ,CASE
                 WHEN GE.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_GE
             ,CASE
                 WHEN CO.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_CO
             ,CASE
                 WHEN LG.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_LG
             ,CASE
                 WHEN PF.ID_Contrat IS NULL THEN "NO Upd" 
                 ELSE "Upd" 
              END as MAJ_PF
       FROM contrat_HIST as GE
       FULL OUTER JOIN contact_HIST as CO
         ON CO.ID_Contrat = GE.ID_Contrat
       FULL OUTER JOIN Legal_Refrence_HIST as LG
         ON LG.ID_Contrat = GE.ID_Contrat
       FULL OUTER JOIN Portfolio_HIST as PF
         ON PF.ID_Contrat = GE.ID_Contrat
    En espérant que les tables ne sont pas trop volumineuses, car full outer join sur 4 tables ca risque de dépoter !
    Merci pour les réponses :-)

    j'essaye de tester cela mais j'ai une erreur "00933. 00000 - 'SQL command not properly ended' " au niveau de la ligne "FROM contrat_HIST as GE". Je n'arrive pas à voir pourquoi... la syntaxe semble être correcte

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par coeurdange Voir le message
    00933. 00000 - 'SQL command not properly ended

    Enlevez les as devant vos alias de table.

  11. #11
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Merci,

    La requête fonctionne après suppression des alias.

    Cette requête me retourne 13 lignes alors que je ne devrais en avoir que 5 (Les 5 HIST_ID), comme montré dans mon dernier tableau. Comment faire?

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Pouvez vous svp afficher le résultat obtenu et surligner ce que vous voulez éliminer

    Merci

  13. #13
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Pouvez vous svp afficher le résultat obtenu et surligner ce que vous voulez éliminer

    Merci

    Le problème c'est que je recherche à avoir ce tableau:

    ID Contrat ID HIST Date Creation GENERAL INFO CONTACT LEGAL REFERENCE PORTFOLIO
    1 1 01/01/2015 Updated Updated Updated No Update
    1 2 15/01/2015 Updated Updated Updated Updated
    1 5 01/07/2015 No Update Updated Updated No Update
    2 3 02/02/2015 Updated Updated No Update No Update
    2 4 01/03/2015 Updated No Update No Update Updated

    Ici, pour avoir les ID_HIST dans la requête, j'ai dû la modifier ainsi:

    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
    SELECT COALESCE(CONTRAT_HIST.ID_HIST, contact_HIST.ID_HIST, Legal_Reference_HIST.ID_HIST, Portfolio_HIST.ID_HIST) ID_HIST, COALESCE(CONTRAT_HIST.ID_Contrat, contact_HIST.ID_Contrat, Legal_Reference_HIST.ID_Contrat, Portfolio_HIST.ID_Contrat) ID_CONTRAT,
    CASE
      WHEN CONTRAT_HIST.ID_Contrat IS NULL THEN 'NO Update'
      ELSE 'Updated' 
    END as MAJ_CONTRAT,
    CASE
      WHEN contact_HIST.ID_Contrat IS NULL THEN 'NO Update'
      ELSE 'Updated'
    END as MAJ_CO,
    CASE
      WHEN Legal_Reference_HIST.ID_Contrat IS NULL THEN 'NO Update'
      ELSE 'Updated' 
    END as MAJ_LG,
    CASE
      WHEN Portfolio_HIST.ID_Contrat IS NULL THEN 'NO Update'
      ELSE 'Updated' 
    END as MAJ_PF
    FROM CONTRAT_HIST
    FULL OUTER JOIN contact_HIST ON contact_HIST.ID_Contrat = CONTRAT_HIST.ID_Contrat
    FULL OUTER JOIN Legal_Reference_HIST ON Legal_Reference_HIST.ID_Contrat = CONTRAT_HIST.ID_Contrat
    FULL OUTER JOIN Portfolio_HIST ON Portfolio_HIST.ID_Contrat = CONTRAT_HIST.ID_Contrat
    Et j'obtiens ces résultats qui après analyse ne sont pas correctes:

    ID_HIST ID_CONTRAT MAJ_CONTRAT MAJ_CO MAJ_LG MAJ_PF
    1 1 NO Update Updated NO Update NO Update
    1 1 NO Update Updated NO Update NO Update
    2 2 NO Update Updated NO Update NO Update
    2 2 NO Update Updated NO Update NO Update
    3 2 NO Update Updated NO Update NO Update
    5 2 NO Update Updated NO Update NO Update
    5 1 NO Update NO Update Updated NO Update
    1 1 NO Update NO Update Updated NO Update
    2 2 NO Update NO Update Updated NO Update
    2 1 NO Update NO Update NO Update Updated
    2 1 NO Update NO Update NO Update Updated
    4 2 NO Update NO Update NO Update Updated
    4 2 NO Update NO Update NO Update Updated

    En plus je ne parviens pas à récupérer le champs DATE_CREATION. Je me demande si le FULL OUTER JOIN est la bonne solution dans ce cas....

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Je n'avais mis dans ma requete que quelques colonnes dans le select à titre d'exemple, pour montrer la démarche du case when else liée au full outer join et aux colonnes nulles.
    Il faut faire le même principe de coalesce pour les autres colonnes que vous souhaitez ajouter
    C'est un peu fastidieux, je le reconnais, c'est pourquoi j'ai eu la flemme de le faire

    Ensuite, il faut expliquer pourquoi vous ne voulez pas par exemple les lignes qui commencent par 2 2... qu'ont elles de différent des autres lignes qui justifient que "ce n'est pas bon"

  15. #15
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Je n'avais mis dans ma requete que quelques colonnes dans le select à titre d'exemple, pour montrer la démarche du case when else liée au full outer join et aux colonnes nulles.
    Il faut faire le même principe de coalesce pour les autres colonnes que vous souhaitez ajouter
    C'est un peu fastidieux, je le reconnais, c'est pourquoi j'ai eu la flemme de le faire

    Ensuite, il faut expliquer pourquoi vous ne voulez pas par exemple les lignes qui commencent par 2 2... qu'ont elles de différent des autres lignes qui justifient que "ce n'est pas bon"
    Ce n'est pas grave pour la colonne, c'est pour cela que je l'ai ajoutée moi même. Par contre le problème majeur c'est qu'en regardant les résultats ils ne correspondent pas au résultats souhaités (voir les 2 tableaux), je n'arrive à retrouver aucun résultat correcte et cohérent, et je ne comprends pas pourquoi.

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par coeurdange Voir le message
    Ce n'est pas grave pour la colonne, c'est pour cela que je l'ai ajoutée moi même. Par contre le problème majeur c'est qu'en regardant les résultats ils ne correspondent pas au résultats souhaités (voir les 2 tableaux), je n'arrive à retrouver aucun résultat correcte et cohérent, et je ne comprends pas pourquoi.
    Oui mais c'est résultats souhaités il faut les exprimer sous forme de règles en français, afin de pouvoir les traduire en langage SQL, or la je ne comprends toujours pas quelle est la règle de sélection qui permet de dire que les 2 premières lignes qui commencent par (1, 1) de votre tableau résultat obtenu sont bien à prendre, alors que les 2 suivantes qui commencent par (2, 2) ne sont pas à prendre, et ce d'autant moins que toutes les autres colonnes du tableau sont identiques

    Une phrase comme : il ne faut sélectionner que les enregistrements dont la date de mise à jour est comprise entre telle et telle date par exemple, peut servir de règle d'extraction

  17. #17
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Oui mais c'est résultats souhaités il faut les exprimer sous forme de règles en français, afin de pouvoir les traduire en langage SQL, or la je ne comprends toujours pas quelle est la règle de sélection qui permet de dire que les 2 premières lignes qui commencent par (1, 1) de votre tableau résultat obtenu sont bien à prendre, alors que les 2 suivantes qui commencent par (2, 2) ne sont pas à prendre, et ce d'autant moins que toutes les autres colonnes du tableau sont identiques

    Une phrase comme : il ne faut sélectionner que les enregistrements dont la date de mise à jour est comprise entre telle et telle date par exemple, peut servir de règle d'extraction
    Les valeurs UPDATE et NO UPDATE ne sont pas correctes pour chaque ligne et chaque colonne du tableau retourné par la requête. Le tableau de résultat n'est donc pas bon.

    Maintenant je souhaiterais récupérer pour chaque HIST_ID (5 lignes au total à retourner) les modifications (ou non) qu'il y a eu sur les information générales (table CONTRAT_HIST), les contacts (Table contact HIST),les légales references (table Legal Refrence HIST) et les portfolios (Table portfolio HIST). "Updated" doit être affiché s'il y a eu effectivement des mises à jour sur les chanmps (Id ou valeurs), et "No update" dans le cas contraire.

    Une mise à jour d'un contrat implique une nouvelle ligne dans CONTRAT_HIST. Sila mise à jour concerne les contacts, portfolios ou legal reference, autant de ligne est alors ajoutée dans ces tables si c'est nécessaire.

    J'espère que ma requête est correctement exprimée.

  18. #18
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    En dessous de quelques millions de ligne par table, on a rarement des soucis, (hors requête mal construite ou problème de contexte bien sur)
    ici, on a 4 occurrences maxi par mise à jour, si la màj concerne les 4 tables donc 4 fois plus qu'avec une requete inner

    Dans un contexte plus général, alors qu'une requete inner ne ramène que l'effectif de l'intersection avec outer on a toutes les combinaisons.
    Ce n'est donc pas mythologique, mais mathématique

    A ceci, on ajoute qu'il n'y a pas de filtrage, puisque c'est tout l'historique qui est demandé
    Brouillard et confusion. Mais les mythologies sont souvent construites de cette manière.
    Relisez-vous; peut être que vous allez vous apercevoir de quelques énormités que vous venez de formuler.

  19. #19
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Dans votre premier post, dans le tableau attendu comme résultat, vous avez cette ligne (la dernière) :

    2 	4 	01/03/2015 	No Update 	No Update 	Updated 	Updated
    
    Pourquoi "No Update" pour GENERAL INFO alors que la description est passée de "Contrat Santé" à "Contrat consommateur" et que le budget est passé de 10 000 à 30 000 ?

  20. #20
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Brouillard et confusion. Mais les mythologies sont souvent construites de cette manière.
    Relisez-vous; peut être que vous allez vous apercevoir de quelques énormités que vous venez de formuler.
    Relisez moi, mais cette fois ci avec vos lunettes : 4 lignes et pas de filtrage donc on prend tout dans chaque table

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/06/2015, 14h19
  2. Réponses: 12
    Dernier message: 12/07/2011, 18h19
  3. Réponses: 3
    Dernier message: 29/09/2009, 12h06
  4. Créer une vue avec un champ Blob
    Par Taoueret dans le forum SQL
    Réponses: 4
    Dernier message: 16/05/2008, 16h18
  5. Impossible de créer une vue avec un champ spatial
    Par M Roncheau dans le forum SQL
    Réponses: 2
    Dernier message: 24/08/2007, 09h11

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