在Oracle中查找重复的子节点

问题描述 投票:0回答:1

我在oracle数据库中有一列存储XML数据。

由于某种原因,我的查询在插入时未检查现有节点,因此导致几行中有重复的节点。

我无法找到找到这些重复项的有效方法。

我的XML看起来像:

<myroot>
  <mydata>

    <myusers>
      <username>amy</username>
      <userole/>
      <userrole>junior artist</userrole>
    </myusers>

    <myusers>
      <username>rosy</username>
      <userole/>
      <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
xml oracle plsql oracle-sqldeveloper child-nodes
1个回答
0
投票

考虑使用'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 |
+----------+---------------+

N.B。我认为输入数据中的“ userole”是一个错字,而您的意思是“ userrole”。

© www.soinside.com 2019 - 2024. All rights reserved.