sql >> データベース >  >> RDS >> Oracle

複数項目のシーケンスを取得しました

    貨物ごとに複数のコンテナがあり、生のXMLからLRNを抽出した後、LRNに基づいてフィルタリングしています。したがって、ネストされたXMLTableオブジェクトを使用する必要があります。 1つ目は、宣言からデータを取得し、委託品をサブXMLTypeとして抽出します。次に、それはコンテナ情報を抽出する2番目の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フィドルデモ

    より複雑なXPathを使用して単一のXMLTable内に保持することもできますが、これはより明確だと思います。



    1. PostgreSQLクエリは制限1で非常に遅い

    2. Postgresの代数的データ型

    3. ストアドプロシージャ内でデータベースを使用する

    4. cx oracle ImportError