sql >> Databáze >  >> RDS >> Oracle

dostal vícepoložkovou sekvenci

Máte více kontejnerů na zásilku a po extrahování z nezpracovaného XML provádíte filtrování na základě LRN; takže musíte použít vnořené objekty XMLTable. První získá data z prohlášení a extrahuje zásilky jako sub-XMLType. To je poté předáno druhé XMLTable, která extrahuje informace o kontejneru.

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';

S vaším (aktualizovaným) vzorovým XML výsledkem:

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

Doufám, že to je to, co chcete vidět.

Ukázka rychlého SQL Fiddle .

Můžete také použít složitější cestu XPath, abyste ji udrželi v jedné tabulce XML, ale myslím, že je to jasnější.



  1. Průsečík období v SQL

  2. Aktualizovat časové razítko při aktualizaci řádku v PostgreSQL

  3. Json zakóduje celou sadu výsledků mysql

  4. Databáze správce balíčků GI 19c RPM