2013-09-27 80 views
1

我有一個表格,其中包含以下示例列,其數據如下所示。每個帳號都有對應的createddtxmlpayload列值。查找Xml列中的重複項

在給定的4行中,我需要找到有效的重複項。每個有效的帳號都有2個xml行(一個語句和一個pdf xml記錄)。如果賬號有兩個記錄與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版本。

+1

*** SQL ***只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......很多東西都是特定於供應商的 - 所以我們真的需要知道什麼**數據庫系統**(和哪個版本)你正在使用(請更新標籤相應).... –

回答

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,但也爲他們工作。

+0

我不期望只是一個計數如上所述。我需要通過在xml列根節點上過濾來查找accountno重複的數量。正如我在我的問題中明確指出的那樣,每個帳號都有兩個xmlpayload行(其中一個以'statement'和'pdf'作爲根],這是一個有效的記錄。如果一個帳號具有兩個具有相同根節點的行,則這些記錄是重複的。 – user1762476

1

對於SQL Server,你可以使用exist()方法從SQLXML,像這樣:

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,您可以使用此查詢:如果你有幾行每個AccountNo(並希望得到Xmlpayload在結果)

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

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

+0

嗨羅曼,我剛剛重組我的記錄,並給你預期的輸出。我運行了你的查詢,並沒有提取任何結果集。我需要根據根節點名稱爲每個帳號過濾重複。請參閱預期的輸出。 – user1762476

+0

@ user1762476你有4行和xml有兩個元素,還是你有8行? –

+0

@ user1762476無論如何,看到更新的查詢 –