在 SQL Server 2008 中使用 XPath/XQuery 将一个属性与另一个属性匹配

2024-04-19

考虑 XML 和 SQL:

declare @xml xml = '
<root>
    <person id="11272">
        <notes for="107">Some notes!</notes>
        <item id="107" selected="1" />
    </person>
    <person id="77812">
        <notes for="107"></notes>
        <notes for="119">Hello</notes>
        <item id="107" selected="0" />
        <item id="119" selected="1" />
    </person>
</root>'

select  Row.Person.value('data(../@id)', 'int') as person_id,
        Row.Person.value('data(@id)', 'int') as item_id,
        Row.Person.value('data(../notes[@for=data(@id)][1])', 'varchar(max)') as notes
from    @xml.nodes('/root/person/item') as Row(Person)

我最终得到:

person_id   item_id     notes
----------- ----------- -------
77812       107         NULL
77812       119         NULL
11272       107         NULL

我想要的是根据当前的 @id 属性提取“注释”列item。如果我更换[@for=data(@id)]在选择器中[@for=107]我当然得到了价值Some notes!在最后一条记录中。是否可以使用 XPath/XQuery 来做到这一点,或者我在这里咆哮错误的树?我认为问题在于

是的,XML 有点尴尬,但恐怕我无法真正更改它。

我找到了一个可行的解决方案,但对于这样的事情感觉非常沉重。

select  Item.Person.value('data(../@id)', 'int') as person_id,
        Item.Person.value('data(@id)', 'int') as item_id,
        Notes.Person.value('text()[1]', 'varchar(max)') as notes
from    @xml.nodes('/root/person/item') as Item(Person)
        inner join @xml.nodes('/root/person/notes') as Notes(Person) on
            Notes.Person.value('data(@for)', 'int') = Item.Person.value('data(@id)', 'int')
            and
            Notes.Person.value('data(../@id)', 'int') = Item.Person.value('data(../@id)', 'int')

Update!

我想到了!我是 XQuery 的新手,但这很有效,所以我称其为“工作完成”:) 我将注释的查询更改为:

Item.Person.value('
    let $id := data(@id)
    return data(../notes[@for=$id])[1]
', 'varchar(max)') as notes

我建议你做一个cross apply而不是做../找到父节点。根据查询计划,它要快得多。

select  P.X.value('data(@id)', 'int') as person_id,
        I.X.value('data(@id)', 'int') as item_id,
        I.X.value('let $id := data(@id)
                   return data(../notes[@for=$id])[1]', 'varchar(max)') as notes
from @xml.nodes('/root/person') as P(X)
  cross apply P.X.nodes('item') as I(X)

您甚至可以删除../在花中,再加上一个额外的交叉,可以获得更多的收益。

select P.X.value('@id', 'int') as person_id,
       TI.id as item_id,
       P.X.value('(notes[@for = sql:column("TI.id")])[1]', 'varchar(max)') as notes
from @xml.nodes('/root/person') as P(X)
  cross apply P.X.nodes('item') as I(X)
  cross apply (select I.X.value('@id', 'int')) as TI(id) 

将查询相互比较后,我在您的查询中得到了 67%,在我的第一个查询中得到了 17%,在第二个查询中得到了 16%。注意:这些数字只是提示您实际上哪种查询实际上会更快。根据您的数据进行测试以确定结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SQL Server 2008 中使用 XPath/XQuery 将一个属性与另一个属性匹配 的相关文章

  • SQL 从一列到另一列搜索字符串

    以前可能有人问过这个问题 但我不知道如何搜索它 我想查找 Column2 中的字符串是否是 Column1 的一部分 或者根本没有在 Column1 中使用 Column1 Column2 ABCDE JKL XC XC PQ A XYZ
  • 如何使用 INSTEAD OF 触发器获取插入表中的新记录的标识

    我在表上使用 INSTEAD OF 插入触发器来设置该行上递增的版本号 并将该行复制到第二个历史记录 审核表 这些行插入到两个表中都没有问题 但是 我无法将第一个表中的新身份返回给用户 Schema CREATE TABLE Table1
  • SQL Server 2008 排序规则冲突 - 如何解决?

    为了简化 POC 我使用字符类型列进行以下查询 select AH NAME1 from GGIMAIN SYSADM BW AUFTR KOPF union select AH NAME1 from GGI2014 SYSADM BW A
  • ConstraintLayout 内的 ImageView 不起作用

    我在正确显示 ImageView 时遇到问题 我想在 ConstraintLayout 中显示 ImageView 在预览中 它看起来完全符合我的需要 但是当我在设备上启动它时 它看起来完全不同 此布局位于回收视图内 这段代码有什么问题
  • 使用nodes()方法在SQL中展平分层XML

    我有一个存储过程 它采用 XML 文档作为参数 其结构类似于以下内容
  • 从 CLOB 内的 XML 到带有路径列表的 Oracle 表

    我使用的Oracle版本是 BANNER Oracle Database 10g Enterprise Edition Release 10 2 0 4 0 64bi PL SQL Release 10 2 0 4 0 Production
  • 带汇总总计和小计

    我有一个脚本可以生成几乎已经存在的结果集 我正在尝试获取小计和总计 我在年份栏中得到了小计 在最后得到了总计 我的目标是让最终结果显示 总计 而不是小计 请注意 由于汇总函数 我的最后一行 位置 也返回为空 SELECT YEAR COUN
  • SQL SERVER 和 SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON

    所以我在创建脚本时一直盲目地使用ansi nulls on quoted identifier on 因为sqlserver在编写对象脚本时会自动生成它们 我真的没有时间关心这些琐碎的废话 但我想必须提出这些问题 鉴于这些是推荐的设置 是否
  • Microsoft SQL Server,在服务器资源管理器中创建新表

    对于 C 编程作业 我必须在 Microsoft SQL Server 中创建一个表 我新安装了 Visual Studio 2013 和 Microsoft SQL Server 2012 当我安装它时 我指定了我的用户进行管理员访问 无
  • 创建表之间的关系

    我的问题特别是关于 sql server 但任何具有任何数据库背景的人都可以回答 如果我希望表 A 与表 B 在某个列上具有 1 1 关系 我是否应该以某种方式修改 CREATE TABLE 语句来标识这种关系 或者这是根本没有完成的事情
  • 无法在 Sql Server 中运行分析功能

    在 Oracle 中它运行良好 oracle的查询如下 SELECT TEAM ID LEVEL ID FF ID MODULE ID TERR ID MERGE KEY count distinct TERR ID over partit
  • 定制 odoo 中的会计和财务模块?

    我正在研究会计和财务模块 我想做一些修改 例如隐藏字段和隐藏税收图表 有人能帮我吗 请告诉我隐藏左侧菜单项 税表 的程序 我也想知道view id隐藏发票表中的税费和底部税费 更新 请让我知道隐藏它们的外部 ID 我无法找到它们 因为它们链
  • 如何使用 ASP.net EF Codefirst 数据注释将 SQL Server 中的列设置为 varchar(max)?

    我一直在网上搜索 试图找出正确的语法 让 Entity Framework Code First 使用一列创建表 varchar max 这就是我所拥有的 默认情况下 这会创建 varchar 128 如何创建 varchar max 我尝
  • 随机化节点顺序 xslt

    我有一个包含如下节点的 XML 文件
  • 如何在不使用完整备份的情况下使用生产数据刷新 SQL Server 测试实例

    我有两台 MS SQL 2005 服务器 一台用于生产 一台用于测试 并且两台服务器的恢复模型均为 完整 我将生产数据库的备份恢复到测试服务器 然后让用户进行更改 我希望能够 回滚对测试 SQL 服务器所做的所有更改 应用自测试服务器最初恢
  • 从 URL 加载 Xml 时出现超时错误

    我正在执行将实时 xml 文件 从实时 url 加载到 XmlDataDocument 的任务 但每次我都会收到错误 操作已超时 代码如下 包含xml feeds的url 我想将其加载到xmlDoc中 XmlDataDocument xml
  • 工具栏下方的白条

    所以我有一个带有工具栏的应用程序 工具栏下方出现一个白条 最后的屏幕截图 我不希望那个栏在那里我尝试添加 maxHeight 以查看它是否有效 但没有运气 这是我的样式和 v21 style xml style
  • 比较字符串结尾的最佳方法是使用 RIGHT、LIKE 还是其他?

    我需要将字符串的结尾与存储过程中可能的结尾列表进行比较 会被叫很多 大概有10 15个候选结局 此时 仅使用代码的解决方案比创建专用于此的表更好 类似的东西 IF ENDSWITH var foo OR ENDSWITH var bar O
  • xmlstarlet:通过位置号选择元素

    我有这个 XML 文件
  • 如何将 XML 读入数据集

    我有一个类 它转到 URL 并使用 xmlDoc Load URL 获取 xml 文档 为了测试该类 我添加了一个 Web 项目以在网格视图中显示 xml 在单击按钮中 我创建了一个 xml 文档的实例并将其填充为 xmlDoc myCla

随机推荐

  • 如何在没有互联网的情况下安装 angular-cli

    如果你只有 zip 文件来安装 angular cli 如何在没有互联网连接的情况下安装它 有了那个邮政编码只有你不会能够实现这一点 因为在bin文件夹 将ng仍然需要一些依赖 为了做到这一点 从官方存储库下载 zip https gith
  • Gradle 未针对 Firebase 云消息传递进行编译

    我注意到 Firebase API 已从 v 9 0 0 升级到 v 9 0 1 因此决定对此进行更改 然而 它并没有引起人们的注意 这是 Gradle Logcat 中的错误 Error 25 13 Failed to resolve c
  • 如果没有 sudo,则无法在 Qt 应用程序中使用键盘

    我有一个在 BeagleBone Black 上运行的交叉编译的嵌入式 Qt 应用程序 它工作正常 但有一件事 如果我不直接在 BeagleBone Black 上运行 它不接受键盘输入sudo 这是一个问题 因为 我无法远程调试应用程序并
  • 如何将多个 Range 对象合并为一个,用作图表源

    我正在尝试制作一个图表 其中多列作为源区域 基本上 我想选择特定的列 跳过一些列 然后将它们全部合并到一个范围中 我设置了一个循环 在其中创建一个范围 并将其地址附加到一个字符串中 并用逗号分隔它们 我很确定这就是 Excel 想要的格式
  • 无法添加自定义 Sonos 服务的帐户

    我创建了 Sonos 音乐服务 并使用 Customsd 将其添加到我的扬声器中 两个端点 URL 常规和安全 均可用 服务已成功添加到扬声器 使用 SoapUI 我可以发送 GetSessionId 的 https 请求 它会返回有效的响
  • textbox1.Text 无法从另一个表单复制 textbox2.Text 值[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 下面是我的代码 private void btnCptKb5 Click object sender EventArgs e Form1 f
  • 最大重叠矩形数

    我看过这个面试问题 但不知道如何回答 给定 N 个矩形 找出重叠矩形的最大数量 例如 对于左下点和右上点表示的矩形 1 1 3 3 2 2 4 4 1 3 2 4 2 2 3 3 返回 3 因为前两个和最后一个矩形重叠 我可以想到一个时间复
  • 努力绑定 tkinter 文本小部件中的标签

    我在 tkinter 模块中的文本小部件上遇到了一些困难 我添加了尝试将函数绑定到的标签 无论我如何输入 它都会发生以下两种情况之一 我可以单击文本小部件 但弹出的唯一功能是最后一个项目 无论我单击何处 第二件事是它会自动输出所有功能 对原
  • 使用 PIVOT 选择列值作为列

    我有一个场景 我希望将每个唯一列值 Val2 的列值 Val1 显示为单个列 最多 10 列 CREATE TABLE TEMP1 Val1 NVARCHAR 4 Val2 NVARCHAR 10 insert into Temp1 Val
  • 如何确定 .NET 中显示器的真实像素大小?

    我想在我的应用程序中以 真实尺寸 显示图像 为此 我需要知道显示器的像素大小 我知道 Windows 显示分辨率名义上是 96dpi 但出于我的目的 我想要更好的猜测 我知道这些信息可能并不总是可用或准确 例如较旧的 CRT 显示器 但我想
  • 如何覆盖 Material-UI MenuItem 选择的背景颜色?

    目前我正在努力设置背景颜色MenuItem选择不同颜色的组件 无需使用 important 来强制执行 组件代码
  • 检测 Javascript 中的操作系统版本并重定向

    Good Day 我做了一些研究 发现你可以使用以下 javascript 来检测用户操作系统 无论是 Android iOS Windows 等 var OSName Unknown OS if navigator appVersion
  • 如何将 Font Awesome 与 Polymer LitElement 结合使用

    我无法让 Font Awesome 图标与 LitElement 一起使用 因为 CSS 样式不会穿透自定义元素的阴影边界 是否可以将 Font Awesome 或其他图标与 LitElement 一起使用 聚合物材料库中有材料图标 那里使
  • xsl 尝试输出“<”而不是“<”

    Update 尽管与以前不太一样 但问题仍然存在 下面是输入内容 输出内容以及我想要输出内容的示例 输入示例 amp lt p amp gt amp lt span style amp quot font size medium amp q
  • Python - 查找字典中最长(最多单词)的键

    有没有一种方法可以快速查询字典对象以找到单词最多的键 所有键都是字符串类型 即 如果具有最大键的项目有五个单词 这是最大的键 3 我如何快速查询字典并返回 int 5 最好的 乔治娜 这将为您提供密钥 max d key lambda x
  • 如何使默认隐藏的控件显示在 Visual Studio 2010 WPF 设计器中?

    我有一个具有隐藏可见性的控件 因为它绑定到视图模型中的一个属性 该属性的默认值导致它被隐藏 我可以通过 XAML 访问它 但我希望它仍然显示在设计器中 有没有一种干净的方法可以做到这一点 目前 我正在手动编辑 可见性 属性以使其显示出来 但
  • 针对 PyPy 进行优化

    这是后续PyPy 的统计分析器 https stackoverflow com questions 17346226 statistical profiler for pypy 我正在 PyPy 下运行一些 Python 代码 并希望对其进
  • 导航抽屉打开时变暗/变暗/模糊活动

    我在用LDrawer https github com ikimuhendis LDrawer在我的项目中 当导航抽屉打开时 我需要使承载导航抽屉的活动变暗 变暗 模糊 我在 Stackoverflow 上遇到过类似的问题 但没有找到令人满
  • Android Studio 打开几分钟后就崩溃了

    我在 Windows 10 上安装了 Android Studio 最新版本 在打开和完成打开项目几分钟后它崩溃了 我在互联网上寻找解决方案 但一直未能找到解决方案 每次崩溃时我都会收到文本错误报告 我对 Android Studio 的了
  • 在 SQL Server 2008 中使用 XPath/XQuery 将一个属性与另一个属性匹配

    考虑 XML 和 SQL declare xml xml