2017-06-22 72 views
1

晕所有,使用UNION删除重复的日期,但保留相同的数据

我希望你能帮助我。我正在使用SQL Server。 我有这样的XML数据:

<Root> 
    <Header> 
    <refNo>S350282535-100060</refNo> 
    <doNumber>0</doNumber> 
    </Header> 
    <Header> 
    <refNo>S350282535-100061</refNo> 
    <doNumber>1</doNumber> 
    </Header> 
    <Detail> 
    <item>114495</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100060</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114496</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114497</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
</Root> 

我怎么能得到这样的数据:

refNo     doNumber Item  qty uom 
-------------------------------------------------------------------- 
S350282535-100060  0   114495  2  PC 
S350282535-100061  1   114496  2  PC 
S350282535-100061  1   114497  2  PC 

这里是我的疑问,我已经尝试过:

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX), @flagParameter AS 
INT 

SELECT @XML = XMLData FROM XMLwithOpenXML 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 
SET @flagParameter = 2 

SELECT item, qty,uom, refNo, remarks, reason 
FROM OPENXML(@hDoc, 'Root/Detail',@flagParameter) 
WITH 
(
    item [int], 
    qty [int], 
    uom [nvarchar] (6), 
    refNo [nvarchar] (50), 
    remarks [nvarchar] (100), 
    reason [nvarchar] (100) 
) 

SELECT refNo, doNumber 
FROM OPENXML(@hDoc, 'Root/Header',@flagParameter) 
WITH 
(
refNo [nvarchar](50), 
doNumber [int] 
) 

SELECT refNo , doNumber, item--, qty,uom, remarks, reason 
FROM OPENXML(@hDoc, 'Root/Detail',@flagParameter) 
WITH 
(
refNo [nvarchar] (50), 
doNumber [int], 
item [int], 
qty [int], 
uom [nvarchar] (6), 
remarks [nvarchar] (100), 
reason [nvarchar] (100) 
) 

UNION 

SELECT refNo, doNumber, One as Item--, two as two, three as three, four as 
four 
FROM OPENXML(@hDoc, 'Root/Header',@flagParameter) 
WITH 
(
refNo [nvarchar](50), 
doNumber [int], 
one [int], 
two [int], 
three [int], 
four [int] 
) EXEC sp_xml_removedocument @hDoc 

我使用联盟,但结果并不像我预期的那样,有没有人可以帮助我?我会感谢你的帮助。

+1

请您分享您尝试的UNION查询吗? –

+0

是的,当然@keyur: – AgusmanPriantoro

+0

我在我的帖子中添加了我的查询。 @keyur – AgusmanPriantoro

回答

0

假设XML数据存储在一个名为@xml XML变量:

DECLARE @xml XML = '<Root> 
    <Header> 
    <refNo>S350282535-100060</refNo> 
    <doNumber>0</doNumber> 
    </Header> 
    <Header> 
    <refNo>S350282535-100061</refNo> 
    <doNumber>1</doNumber> 
    </Header> 
    <Detail> 
    <item>114495</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100060</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114496</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114497</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
</Root>' 

下面是一个可能的方式使用XML methods来获得期望的结果和XPath/XQuery的,而不是旧的OPENXML:

;WITH Header(refNo, doNumber) 
AS 
(
    SELECT 
     T.C.value('refNo[1]', 'varchar(100)') 
     ,T.C.value('doNumber[1]', 'int') 
    FROM @xml.nodes('/Root/Header') AS T(C) 
) 

SELECT 
    Header.* 
    ,T.C.value('item[1]', 'varchar(100)') 'item' 
    ,T.C.value('qty[1]', 'int') 'qty' 
    ,T.C.value('uom[1]', 'varchar(100)') 'uom' 
FROM @xml.nodes('/Root/Detail') AS T(C) 
INNER JOIN Header on T.C.value('refNo[1]', 'varchar(100)') = refNo 

demo

+0

非常感谢你,它的功能就像一个魔法。 – AgusmanPriantoro

+0

@AgusmanPriantoro欢迎您。由于你迄今从未做过,所以我会提醒你考虑[接受答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)如果它解决了有问题的问题。 – har07

相关问题