Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

có chuỗi nhiều mặt hàng

Bạn có nhiều thùng chứa cho mỗi lô hàng và bạn đang lọc dựa trên LRN sau khi trích xuất dữ liệu đó từ XML thô; vì vậy bạn cần sử dụng các đối tượng XMLTable lồng nhau. Cái đầu tiên lấy dữ liệu từ tờ khai và trích xuất các lô hàng dưới dạng một XMLType con. Sau đó, nó được chuyển đến XMLTable thứ hai để trích xuất thông tin vùng chứa.

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

Với XML mẫu (đã cập nhật) của bạn, nó tạo ra:

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

Hy vọng rằng đó là những gì bạn muốn xem.

Bản trình diễn SQL Fiddle nhanh .

Bạn cũng có thể sử dụng XPath phức tạp hơn để giữ nó trong một XMLTable duy nhất, nhưng tôi nghĩ điều này rõ ràng hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm các mục trùng lặp trong một cột

  2. Truy vấn GROUP BY hợp lệ không hoạt động khi kết hợp với INSERT INTO trên Oracle

  3. Thuộc tính tin nhắn UTL_MAIL gọi OWA_UTIL.cellsprint thủ tục Oracle

  4. Trích xuất phần thời gian từ cột TimeStamp trong ORACLE

  5. Oracle REF không thể vượt qua