2013-09-27 7 views
1

У меня есть таблица со следующими примерами столбцов с данными, приведенными ниже. Каждый номер счета имеет соответствующие значения столбцов createddt и xmlpayload.Найти дубликаты в столбце Xml

В данных 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.

+1

*** SQL *** - это только * Structured Query Language * - язык, используемый многими системами баз данных, но не продукт базы данных ... многие вещи специфичны для поставщиков, поэтому нам действительно нужно знать, что такое ** база данных system ** (и какую версию) вы используете (пожалуйста, обновите теги соответственно) .... –

ответ

0

Я не на 100%, что вы хотите сосчитать. То, что я знаю наверняка, это то, что вы можете рассчитывать узлов в файле XML в MSSQL версии, как это:

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. Эта часть действительна, но я не знаю sysntax для поиска таких узлов, как это, но работает и для них.

+0

Я не ожидал, что вы считаете, что вы считаете выше. Мне нужно найти количество дубликатов accountno, отфильтровывая их на корневом узле xml-столбца. Как я четко заявил в своем вопросе, каждый номер счета имеет две строки xmlpayload (один с «statement» и «pdf» как root), который является допустимой записью. Если номер учетной записи имеет две строки с одним корневым узлом, эти записи дублируются. – 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, вы можете использовать этот запрос:

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

+0

Привет, Роман, я только что изменил свои записи и дал вам ожидаемый результат. Я выполнил ваш запрос и не получил никаких результатов.Мне нужен дубликат для каждой фильтрации номеров учетных записей на основе имени корневого узла. Посмотрите ожидаемый результат. – user1762476

+0

@ user1762476 У вас есть 4 строки и xml, имеющие два элемента или у вас есть 8 строк? –

+0

@ user1762476 в любом случае, см. Обновленные запросы –

Смежные вопросы