Oracle
 sql >> Baza danych >  >> RDS >> Oracle

otrzymałem sekwencję wieloelementową

Masz wiele kontenerów na przesyłkę i filtrujesz na podstawie LRN po wyodrębnieniu go z surowego kodu XML; więc musisz użyć zagnieżdżonych obiektów XMLTable. Pierwszy pobiera dane z deklaracji i wyodrębnia przesyłki jako sub-XMLType. Jest on następnie przekazywany do drugiej tabeli XML, która wyodrębnia informacje o kontenerze.

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

Z Twoim (zaktualizowanym) przykładowym kodem XML, który daje:

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

Mam nadzieję, że właśnie to chcesz zobaczyć.

Szybkie demo SQL Fiddle .

Możesz również użyć bardziej skomplikowanego XPath, aby utrzymać go w jednym XMLTable, ale myślę, że jest to jaśniejsze.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodawanie INNER JOIN do zapytania z podzapytaniem z instrukcją Inline Select

  2. Maksymalny rozmiar puli połączeń

  3. Jaka jest właściwa komenda odbc do wywoływania procedury składowanej Oracle z parametrami z .Net?

  4. Usuwanie nakładających się godzin z liczenia dni wolnych od pracy

  5. Jak zmienić strukturę tabeli w Oracle?