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 :

XMLTABLE - Répétition de données


Sujet :

SQL Oracle

  1. #1
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut XMLTABLE - Répétition de données
    Forum,
    J'espère que tout va bien pour vous tous !

    J'ai cette requête qui fonctionne bien - mais uniquement pour certains cas. Elle me récupère un Scalescore qui est la somme des Column.

    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
    SELECT
        xt.*
        ,im.file_number AS FileN
        ,per.inss AS niss
        ,im.OVERALL_START_DATE 
        ,im.MESSAGE_ID 
    FROM
        inbox_messages im
        INNER JOIN persons per ON per.person_id = im.person_id 
        ,XMLTABLE
            ('*'
             PASSING XMLTYPE.CREATEXML(im.CONTENT)
             COLUMNS 
                ScaleScore 	NUMBER PATH '//ScaleScore'
                ,Column1	NUMBER PATH '//Column1'
                ,Column2	NUMBER PATH '//Column2'
                ,Column3	NUMBER PATH '//Column3'
                --,BeginDate	DATE PATH '//BeginDate'
                --,EndDate 	DATE PATH '//EndDate'
     
            ) AS xt
    WHERE im.TYPE = 'T002'
        AND im.overall_start_date BETWEEN '01/06/2020' AND '30/11/2020'
    ORDER BY niss
    ;
    Mon soucis vient du fait que certains XML contiennent deux décisions et donc deux ScaleScore. Du coup, j'ai un message me disant qu'il y a des données multiples alors qu'il veut de l'unique. Pouvez-vous me dire comment je dois procéder pour résoudre ce problème ?

    J'ai regardé sur le net et j'ai vu toute sorte de choses même avec des boucles mais je n'y arrive pas.

    NB : pour info, mon XML est dans un colonne CLOB.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 161
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Tu veux retourner les 2 valeurs ou seulement une (si oui laquelle des 2?)

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sinon, en plsql ça doit être possible en parsant le XML et ensuite en lisant tous les éléments du DOM. https://docs.oracle.com/cd/B10501_01...1/adx20ppl.htm

  4. #4
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Le but est de récupérer toutes les données qui remplissent les conditions ; parfois, une donnée, d'autre fois, plusieurs données.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Vous ne pouvez pas utiliser le singleton [n] dans les path XML d'Oracle ?

    A +

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 161
    Points : 1 956
    Points
    1 956
    Par défaut
    Si, c'est possible de choisir un élément à l'aide des crochets. Là si je comprends bien il faudrait déclarer Scalescore non pas en NUMBER mais en XMLTYPE puisqu'il a plusieurs valeurs, mais sans voir le contenu c'est un peu compliqué de deviner.

  7. #7
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Un grand merci pour vos réactions...
    Voici un exemple avec des données fictives.


    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
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!--Build-Version: 1.510.0-REV70887db677-20200429T1608--><tns:Certificate xmlns:tns="https://appprod.be" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://appprod.be T002_v2.xsd">
      <Header>
        <MessageId>T002</MessageId>
        <SocialFund>299</SocialFund>
        <Office>27</Office>
        <FileNumber>5050555</FileNumber>
        <Role>104</Role>
        <IntegrationPeriod>
          <StartDate>2019-10-01</StartDate>
        </IntegrationPeriod>
        <ProcessDate>2020-05-07T02:20:00</ProcessDate>
        <Reference NRK="effae4290a6ea78e6e5c5de35b0ff682" Requestor="PN3CPKO8OANO3A3"/>
        <Person>
          <PersonINSS>14082011872</PersonINSS>
          <PersonName>JADAR</PersonName>
          <PersonFirstName>KYLLIE</PersonFirstName>
          <PersonDateOfBirth>
            <Day>---20</Day>
            <Month>--08</Month>
            <Year>2014</Year>
          </PersonDateOfBirth>
        </Person>
        <KSZMailboxNbr>00000450016183</KSZMailboxNbr>
      </Header>
      <Body>
        <CertificateIdentification>
          <CertificateNr>007294503393456</CertificateNr>
          <CertificateSituationNbr>0</CertificateSituationNbr>
          <CertificateStatus>2</CertificateStatus>
          <CertificateCreationDate>2020-05-06</CertificateCreationDate>
        </CertificateIdentification>
        <ChildIdentification>
          <PersonINSS>14082011872</PersonINSS>
          <DossierLanguage>F</DossierLanguage>
        </ChildIdentification>
        <ApplicationIdentification>
          <Scenario>01</Scenario>
          <Demand>
            <SequenceNbr>1</SequenceNbr>
            <BeginDate>2015-01-01</BeginDate>
            <DisablementRecognition>0</DisablementRecognition>
            <DegreeOfAutonomy>0</DegreeOfAutonomy>
            <WorkDisablement>0</WorkDisablement>
            <SchoolingDisablement>0</SchoolingDisablement>
            <MedicoSocialScale>1</MedicoSocialScale>
          </Demand>
        </ApplicationIdentification>
        <FPSDossier>
          <PersonINSS>14082011872</PersonINSS>
          <CompletionDate>2020-03-16</CompletionDate>
          <DecisionDate>2020-05-04</DecisionDate>
          <MedicalAppraisement>
            <RequestSequenceNbr>1</RequestSequenceNbr>
            <MedicoSocialScale>
              <ScaleScore>8</ScaleScore>
              <Column1>4</Column1>
              <Column2>2</Column2>
              <Column3>2</Column3>
            </MedicoSocialScale>
            <BeginDate>2015-01-01</BeginDate>
            <EndDate>2019-12-31</EndDate>
          </MedicalAppraisement>
          <MedicalAppraisement>
            <RequestSequenceNbr>1</RequestSequenceNbr>
            <MedicoSocialScale>
              <ScaleScore>17</ScaleScore>
              <Column1>6</Column1>
              <Column2>5</Column2>
              <Column3>6</Column3>
            </MedicoSocialScale>
            <BeginDate>2020-01-01</BeginDate>
            <EndDate>2020-06-30</EndDate>
          </MedicalAppraisement>
          <MedicalAppraisement>
            <RequestSequenceNbr>1</RequestSequenceNbr>
            <MedicoSocialScale>
              <ScaleScore>11</ScaleScore>
              <Column1>4</Column1>
              <Column2>3</Column2>
              <Column3>4</Column3>
            </MedicoSocialScale>
            <BeginDate>2020-07-01</BeginDate>
            <EndDate>2021-12-31</EndDate>
          </MedicalAppraisement>
        </FPSDossier>
      </Body>
    </tns:Certificate>

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il peut y avoir de résolutions différentes dépendant de ce qu'on veut au final. Une façon de faire est quelque peu comme faire de cross join avec des données ScaleScore, Column1 ... apparient en chaque ligne pour chaque MedicalAppraisement d'un patient... (On devrait sérrer écriture avec plus de rigueur pour des documents médicaux sérieux... laissant moins de places libres aux caprices en xpath.) Comme ça, pour idée générale, sans testé préalable - caution - :
    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
        xt.*
        ,im.file_number AS FileN
        ,per.inss AS niss
        ,im.OVERALL_START_DATE 
        ,im.MESSAGE_ID 
    FROM
        inbox_messages im
        INNER JOIN persons per ON per.person_id = im.person_id 
        ,XMLTABLE
            (NAMESPACES('https://appprod.be' AS tns), '$doc/tns:certificate/Body/FPSDossier/MedicalAppraisement',
            PASSING XMLTYPE.CREATEXML(im.CONTENT) AS doc
            COLUMNS 
                ScaleScore  NUMBER PATH 'ScaleScore'
                ,Column1    NUMBER PATH 'Column1'
                ,Column2    NUMBER PATH 'Column2'
                ,Column3    NUMBER PATH 'Column3'
                --,BeginDate    DATE PATH 'BeginDate'
                --,EndDate  DATE PATH 'EndDate'
            ) AS xt
    WHERE im.TYPE = 'T002'
        AND im.overall_start_date BETWEEN '01/06/2020' AND '30/11/2020'
    ORDER BY niss
    ;

Discussions similaires

  1. Traitement et répétition de données
    Par warrio67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/06/2010, 17h42
  2. Répétition des données
    Par zbahoui dans le forum C++
    Réponses: 3
    Dernier message: 02/05/2010, 15h42
  3. problème de répétition de données
    Par marcuswillbe dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 11/02/2009, 18h14
  4. Répétition de données sur liste modifiable
    Par salut_tt dans le forum IHM
    Réponses: 2
    Dernier message: 22/04/2008, 21h09
  5. Répétition de données identiques...
    Par Regis.C dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 15/04/2004, 22h46

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