使用 UNION 删除重复日期但保留相同数据

Using UNION to remove duplicate date but keep the same data

全部晕,

希望你能帮助我。我正在使用 SQL 服务器。 我有这样的 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

我使用了 UNION,但是结果并不如我所愿,有谁能帮助我吗?非常感谢你的帮助。

假设 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