Oracle
 sql >> база данни >  >> RDS >> Oracle

има последователност от множество елементи

Имате няколко контейнера на пратка и филтрирате въз основа на LRN, след като го извлечете от необработения XML; така че трябва да използвате вложени XMLTable обекти. Първият получава данните от декларацията и извлича пратките като под-XMLType. След това се предава на втората XMLTable, която извлича информацията за контейнера.

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

С вашия (актуализиран) примерен XML, който произвежда:

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

Надяваме се, че това е, което искате да видите.

Бърза демонстрация на SQL Fiddle .

Можете също да използвате по-сложен XPath, за да го запазите в рамките на една XMLTable, но мисля, че това е по-ясно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се справим с ограничението за дълбоко влагане от 1 ниво в Oracle?

  2. Как да извлечете номера на седмицата в sql

  3. Оператор Oracle (+).

  4. Как да съединя две таблици въз основа на стойности на подниз на полета?

  5. Не може да се включи в разпределена транзакция с NHibernate