sql - 将列中的 XML 节点连接到另一个表中的字段

标签 sql sql-server xml t-sql

我有两个结构与此类似的表:

Table1 ([Table1Id] INT,
        [Sequence] INT,
        [Table2Id] INT)

Table2 ([Table2Id] INT,
        [XMLData] XML)

表 2 中 XML 的基本部分是:

<Root>
    <Record>
        <Sequence>1</Sequence>
        <Order>
            <Product>Widget</Product>
        </Order>
    </Record>
    <Record>
        <Sequence>2</Sequence>
        <Order>
            <Product>Bolt</Product>
        </Order>
    </Record>
</Root>

我需要能够从表 1 连接到表 2,然后根据序列号提取适当的记录,以获得如下结果集:

Table1Id Table2Id Sequence Product
-------- -------- -------- -----------
       1        1        1 Widget
       1        1        2 Bolt

我不知道如何得到这个结果。任何帮助将不胜感激。

最佳答案

在 xquery 的谓词中使用 sql:column(),将 XML 中的 Sequence 值与 Table1 中的 Sequence 值进行比较。

select T1.Table1ID,
       T1.Table2Id,
       T1.Sequence,
       T2.XMLData.value('(/Root/Record[Sequence/text() = sql:column("T1.Sequence")]/Order/Product/text())[1]', 'nvarchar(50)') as Product
from Table1 as T1
  inner join Table2 as T2
    on T1.Table2Id = T2.Table2Id

SQL Fiddle

关于sql - 将列中的 XML 节点连接到另一个表中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094136/

相关文章:

php - 在 PHP 中使用命名空间循环 xml

mysql - 从名称首字母相同的表中选择

c# - 使用 DataGridView 控件和 Access 数据库查询时如何处理错误?

sql - 使用索引按字符串前缀选择

SQL Server 循环删除记录超出锁定超时

sql-server - 超过 1 列的 B 树索引是什么样的?

mysql - 如何确保记录始终位于 mysql 中给定结果集中的顶部?

sql - 查找两个时间范围之间的日期差距

java - 错误 APIRest JBPM 6.2 RemoteRuntimeEngineFactory

java - 删除App中之前添加的数据