xml - 在 Oracle 中查找重复的子节点
问题描述
我在 oracle 数据库中有一个存储 XML 数据的列。
出于某种原因,我的查询在插入时没有检查现有节点,因此导致在几行中出现重复节点。
我无法找到找到这些重复项的有效方法。
我的 XML 看起来像:
<myroot>
<mydata>
<myusers>
<username>amy</username>
<userrole/>
<userrole>junior artist</userrole>
</myusers>
<myusers>
<username>rosy</username>
<userrole/>
<userrole>junior artist</userrole>
</myusers>
<myusers>
<username>timmy</username>
<userrole>junior artist</userrole>
</myusers>
</mydata>
</myroot>
如上面的 XML 示例所示,空节点在几行的几个标签中处于空闲状态,但有没有办法我可以找到哪些行包含重复项?
过去我使用下面的查询来提取这些数据,但不知道如何提取两个数据:
SELECT MYID, EXTRACT(MYDATA, 'myroot/mydata/myusers/userole/text()')
FROM MYTABLE
WHERE
EXISTNODE(MYDATA, 'myroot/mydata/myusers/userole') = 1
仅作为背景,我的其他数据提取查询未发送以下错误是现在需要修复上述数据的原因:
ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence
解决方案
考虑使用“XMLTABLE”代替其他现已弃用的“EXTRACT”函数。
如果您将 XML 放在一个表中,我将在下面的示例中将其称为“tbl”,您可以这样做:
with tbl as
(
select
XMLType(
'<myroot>
<mydata>
<myusers>
<username>amy</username>
<userrole/>
<userrole>junior artist</userrole>
</myusers>
<myusers>
<username>rosy</username>
<userrole/>
<userrole>junior artist</userrole>
</myusers>
<myusers>
<username>timmy</username>
<userrole>junior artist</userrole>
</myusers>
</mydata>
</myroot>'
) xmldata
from
dual
)
select username, userrole
from (
select username, userrole, count(*) over ( partition by username) rolecnt
from tbl,
xmltable('/myroot/mydata/myusers/userrole'
PASSING tbl.xmldata
COLUMNS username VARCHAR2(80) PATH './../username',
userrole VARCHAR2(80) PATH '.')
)
where rolecnt > 1
+----------+---------------+ | USERNAME | USERROLE | +----------+---------------+ | amy | | | amy | junior artist | | rosy | | | rosy | junior artist | +----------+---------------+
注意我假设您输入数据中的“用户角色”是一个错字,并且您的意思是“用户角色”。
推荐阅读
- scala - Akka HTTP client throws SSLHandshakeException and is unable to find valid certification path to requested target
- parquet - parquet 中一列 NULLS 的重量是多少?
- mongodb - Mongodb:如何根据当前月份生成所有日期
- php - Laravel 5.8 - 文件系统存储::url() 非常慢
- java - Spring Contracts:如何将字符串集合作为 RequestBody 发送
- javascript - 尝试在 CSJS 的 viewscope 中设置 BS 手风琴的状态,但值始终相同(并且不正确)
- visual-studio - VS2017 关闭后重启 - 如何调查/诊断原因?
- here-api - 使用 Fleet Telematics API 按国家/地区获取摘要
- mysql - 如何使用 JOIN 从 SELECT 表中更新字段
- ionic-framework - 如何在 Ionic 4 中使用模板连接字符串?