1

我有一个表格,其中包含以下示例列,其中数据如下所示。每个帐号都有一个对应的createddtxmlpayload值。

在给定的 4 行中,我需要找到有效的重复项。每个有效的帐号有 2 个 xml 行(一个报表和一个 pdf xml 记录)。如果帐号有 2 条具有相同类型的 xml 根节点的记录,例如 pdf 记录 (2335577),则它应该是重复的。如何通过查询 xml 列来过滤精确的重复项。请帮忙。

Records:  
    AccountNo   **Xmlpayload**  
    2335566     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/><ns0:Statement>
    2335566     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt> 
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>       
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>      
    4332355     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>       
    4332355     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>      
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>       
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>   

My Expected Output:  
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>       
    2335577     <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>      
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>       
    6723588     <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>   

我正在使用 SQL 2008 R2 版本。

4

2 回答 2

1

对于 SQL Server,您可以使用sqlxml 中的 exists ()方法,如下所示:

with xmlnamespaces ('uri' as ns0)
select *
from Table1 as t
where t.Xmlpayload.exist('ns0:PDF[2]') = 1

或者您可以将 xquery count()函数与value()方法一起使用:

with xmlnamespaces ('uri' as ns0)
select *
from Table1 as t
where t.Xmlpayload.value('count(ns0:PDF)', 'int') > 1;

sql fiddle demo

更新

如果每个 AccountNo 都有一个,则可以使用以下查询:

with xmlnamespaces ('uri' as ns0)
select *
from Table2 as t
where t.Xmlpayload.exist('ns0:PDFStmt[2]') = 1

如果每个 AccountNo 有几行(并希望在结果集中获取 Xmlpayload):

with
xmlnamespaces ('uri' as ns0),
cte as (
    select
        *, count(*) over(partition by AccountNo) as cnt
    from Table1 as t
    where t.Xmlpayload.exist('ns0:PDFStmt') = 1
)
select *
from cte
where cnt > 1;

sql fiddle demo

于 2013-09-27T06:21:57.303 回答
0

我不是你想要计算的 100%。我可以肯定的是,您可以在 MSSQL 版本中计算 XML 文件中的节点,如下所示:

declare @xml xml
select @xml= convert(xml,N'<ns0 xmlns:ns0="uri"><empid>123</empid><age>23</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>32</age></ns0>    
<ns0 xmlns:ns0="uri"><empid>123</empid><age>23</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>32</age></ns0>')

select count(*) as nr
from @xml.nodes('root/ns0/empid') as S(N)

请注意,我还修改了您的 xml,因为它无效。我将empid>123 empid/>转换为empid>123 /empid>

, 年龄相同

我删除了:声明和:PDF。这部分是有效的,但我不知道用于搜索这样的 throw 节点的 sysntax,但也适用于它们。

于 2013-09-27T05:55:12.627 回答