【问题标题】:Join between XML objects with different paths连接不同路径的 XML 对象
【发布时间】:2022-06-29 18:20:22
【问题描述】:

甲骨文 18c:

db<>fiddle 带有样本数据。

(1) 我有一个从 XML clob 列中提取 domain 数据的查询:

select      
    substr(i.name       ,0,17) as domain_name,
    substr(x.code       ,0,13) as domain_code,
    substr(x.description,0,35) as domain_description
from        
    gdb_items_vw i
cross apply xmltable(
    '/GPCodedValueDomain2/CodedValues/CodedValue' 
    passing xmltype(i.definition)
    columns
        code        varchar2(255) path './Code',
        description varchar2(255) path './Name'
    ) x    
where      
    i.name in('ACTIVITY_ATN_1','ACTIVITY_GCSM_1','ACTIVITY_MS_2')
    and i.name is not null
DOMAIN_NAME       DOMAIN_CODE   DOMAIN_DESCRIPTION                 
----------------- ------------- -----------------------------------
ACTIVITY_ATN_1    RECON_S       RECONSTRUCT SIDEWALK               
ACTIVITY_ATN_1    RECON_T       RECONSTRUCT TRAIL                  
ACTIVITY_GCSM_1   CON_GCSM      CONSTRUCT GCSM                     
ACTIVITY_GCSM_1   RECON_GCSM    RECONSTRUCT_GCSM                   
ACTIVITY_MS_2     M             LIFT AND SWING BRIDGE MAINTENANCE  
ACTIVITY_MS_2     C             BRIDGE CLEANING     

(2) 我有一个查询,它从同一个 XML clob 列中提取 subtype 数据:

select 
    substr(i.name               ,0,18) as object_name,
    substr(x.subtype_code       ,0,12) as subtype_code,
    substr(x.subtype_description,0,35) as subtype_description,
    substr(x.subtype_field      ,0,15) as subtype_field,
    substr(x.subtype_domain     ,0,20) as subtype_domain
from   
    gdb_items_vw i
cross apply xmltable(
    '/DETableInfo/Subtypes/Subtype/FieldInfos/SubtypeFieldInfo[FieldName="ACTIVITY"]'
    passing xmltype(i.definition)
    columns
        subtype_code        number(38,0)  path './../../SubtypeCode',
        subtype_description varchar2(255) path './../../SubtypeName',
        subtype_field       varchar2(255) path './FieldName',
        subtype_domain      varchar2(255) path './DomainName'
    ) x
where  
    i.name is not null
    and i.name = 'INFRASTR.BC_EVENTS'
OBJECT_NAME        SUBTYPE_CODE SUBTYPE_DESCRIPTION                 SUBTYPE_FIELD   SUBTYPE_DOMAIN      
------------------ ------------ ----------------------------------- --------------- --------------------
INFRASTR.BC_EVENTS 0            ACTIVE TRANSPORTATION               ACTIVITY        ACTIVITY_ATN_1      
INFRASTR.BC_EVENTS 1            GEODETIC CONTROL SURVEY MONUMENT    ACTIVITY        ACTIVITY_GCSM_1     
INFRASTR.BC_EVENTS 2            MUNICIPAL STRUCTURES (BRIDGES)      ACTIVITY        ACTIVITY_MS_2       

domains 的 XML 路径与 subtypes 不同。所以这就是为什么我认为我需要为每个单独的查询,即使它们都来自相同的底层视图:gdb_items_vw

  • 域路径:/GPCodedValueDomain2/CodedValues/CodedValue
  • 子类型路径:/DETableInfo/Subtypes/Subtype/FieldInfos/SubtypeFieldInfo[FieldName="ACTIVITY"]

目标:

我想从domain.domain_name加入到subtype.subtype_domain得到如下结果:

DOMAIN_NAME       DOMAIN_CODE   DOMAIN_DESCRIPTION                  SUBTYPE_CODE
----------------- ------------- ----------------------------------- ------------
ACTIVITY_ATN_1    RECON_S       RECONSTRUCT SIDEWALK                0           
ACTIVITY_ATN_1    RECON_T       RECONSTRUCT TRAIL                   0           
ACTIVITY_GCSM_1   CON_GCSM      CONSTRUCT GCSM                      1           
ACTIVITY_GCSM_1   RECON_GCSM    RECONSTRUCT_GCSM                    1           
ACTIVITY_MS_2     M             LIFT AND SWING BRIDGE MAINTENANCE   2           
ACTIVITY_MS_2     C             BRIDGE CLEANING                     2   

换句话说,我想将subtype_code 列带入domains 查询。


问题:

加入这两个查询的最佳方法是什么?是拥有两个单独查询并通过 SQL left join 将它们连接在一起的唯一选择吗?

【问题讨论】:

    标签: sql xml oracle join oracle18c


    【解决方案1】:

    我是 XML 新手。可能有更好的方法来做到这一点。


    SQL 连接:

    如前所述,两个查询的共同键是“域名”,存储在domain.domain_namesubtype.subtype_domain中。

    一种选择可能是将两个单独的查询存储在主查询的 WITH 子句中。然后在主查询的正文中,执行一个简单的left joinsubtype_code 列带入domains 查询。

    with 
    domain as  (...),
    subtype as (...)
       
    select
        d.domain_name,
        d.domain_code,
        d.domain_description,
        s.subtype_code
    from
        domain d
    left join
        subtype s
        on d.domain_name = s.subtype_domain
    
    DOMAIN_NAME       DOMAIN_CODE   DOMAIN_DESCRIPTION                  SUBTYPE_CODE
    ----------------- ------------- ----------------------------------- ------------
    ACTIVITY_ATN_1    RECON_S       RECONSTRUCT SIDEWALK                0           
    ACTIVITY_ATN_1    RECON_T       RECONSTRUCT TRAIL                   0           
    ACTIVITY_GCSM_1   CON_GCSM      CONSTRUCT GCSM                      1           
    ACTIVITY_GCSM_1   RECON_GCSM    RECONSTRUCT_GCSM                    1           
    ACTIVITY_MS_2     M             LIFT AND SWING BRIDGE MAINTENANCE   2           
    ACTIVITY_MS_2     C             BRIDGE CLEANING                     2           
    

    db<>fiddle 带有样本数据。

    我很高兴听到有关该方法的任何改进。

    【讨论】:

      猜你喜欢
      • 2014-01-27
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多