sql >> Database >  >> RDS >> Oracle

heb volgorde van meerdere items

Je hebt meerdere containers per zending en je filtert op basis van LRN nadat je dat uit de onbewerkte XML hebt geëxtraheerd; dus u moet geneste XMLTable-objecten gebruiken. De eerste haalt de gegevens uit de aangifte en extraheert de zendingen als sub-XMLType. Dat wordt dan doorgegeven aan de tweede XMLTable die de containerinformatie extraheert.

SELECT x1.lrn, x1.username, x2.containerNumber
FROM dmsimport_decl d
CROSS JOIN XMLTable(
  XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
    'http://www.xxxx.invalid/xxx/schema/common' AS "c",
    'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"),
  '/d:declaration'
  PASSING d.object_value
  COLUMNS
    lrn VARCHAR2(35 CHAR)
      PATH 'c:declarationHeader/c:localReferenceNumber/text()',
    username CHAR(25)
      PATH 'c:declarationHeader/c:username/text()',
    consignment XMLType
      PATH 'd:goodsShipments/d:consignment'
) x1
CROSS JOIN XMLTable(
  XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
    'http://www.xxxx.invalid/xxx/schema/common' AS "c",
    'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"),
  '//d:transportEquipment'
  PASSING x1.consignment
  COLUMNS
    containerNumber VARCHAR2(35 CHAR)
      PATH 'd:id/text()'
) x2
WHERE x1.lrn = 'NLDMS111111150010950';

Met uw (bijgewerkte) voorbeeld-XML levert dat:

LRN                                 USERNAME                  CONTAINERNUMBER                   
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950                testSC testSC             abcd                               
NLDMS111111150010950                testSC testSC             bcde                               
NLDMS111111150010950                testSC testSC             cdef                               
NLDMS111111150010950                testSC testSC             defg                               
NLDMS111111150010950                testSC testSC             efgh                               

Hopelijk is dat wat je wilt zien.

Snelle SQL Fiddle-demo .

Je zou ook een ingewikkelder XPath kunnen gebruiken om het binnen een enkele XMLTable te houden, maar ik denk dat dit duidelijker is.



  1. Hoe een Got min één van een leesaanroepfout te benaderen bij het verbinden met een Amazon RDS Oracle-instantie

  2. TypeORM PostgreSQL selecteer waar het JSON-veld gelijk is aan een bepaalde waarde

  3. PostgreSQL accepteert geen kolomalias in WHERE-clausule

  4. Hoe maak ik een veilige query voor het uitvoeren van een bulkinvoeging in MySQL met MySQLCommand in C# zonder een opgeslagen proces te gebruiken?