【问题标题】:Joining on an XML attribute加入 XML 属性
【发布时间】:2014-03-25 18:21:03
【问题描述】:

我有一些 xml 存储在 varchar 列中,其中一些节点的属性中的 id 是另一个表中的键。如何对多个属性进行连接?我知道下面的 value 方法只返回一个 id (以及第一个)。

create table #table1 (id1 int, col1 varchar(50));
create table #table2 (id2 varchar(1), col2 varchar(4));

insert into #table1 (id1, col1) values
('1', '<a><b id="1"></b><b id="2"></b></a>');

insert into #table2 (id2, col2) values
('1', 'val1'),
('2', 'val2');

select * from #table1 t1
left join #table2 t2 on t2.id2 = cast(t1.col1 as xml).value('(/a/b/@id)[1]', 'varchar(1)')

返回

id1  col1                                   id2 col2
1    <a><b id="1"></b><b id="2"></b></a>    1   val1

如何获取 table2 的 ID 2 返回的另一行?

1    <a><b id="1"></b><b id="2"></b></a>    2   val2

【问题讨论】:

    标签: sql tsql xquery xquery-sql


    【解决方案1】:

    如果您的类型正确,这会容易得多:)

        CREATE TABLE #table1 ( id1 INT, col1 VARCHAR(50) );
        CREATE TABLE #table2
            (
              id2 VARCHAR(1)
            , col2 VARCHAR(4)
            );
    
        INSERT  INTO #table1
                ( id1
                , col1
                )
        VALUES  ( '1'
                , '<a><b id="1"></b><b id="2"></b></a>'
                );
    
        INSERT  INTO #table2
                ( id2, col2 )
        VALUES  ( '1', 'val1' ),
                ( '2', 'val2' );
     ;
        WITH    c AS ( SELECT   id1
                              , col1 = CONVERT(XML, col1)
                       FROM     #table1 t
                     )
            SELECT  id1
                  , col1
                  , id2
                  , col2
            FROM    c
                    CROSS APPLY c.col1.nodes('(/a/b)') q ( x )
                    LEFT JOIN #table2 t2 ON t2.ID2 = x.value('./@id', 'varchar(1)')
    
    
        DROP TABLE #table1, #table2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多