【问题标题】:Using UNION to remove duplicate date but keep the same data使用 UNION 删除重复的日期但保留相同的数据
【发布时间】:2017-06-22 04:58:49
【问题描述】:

光环,

我希望你能帮助我。我正在使用 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

我使用 UNION,但结果与我的预期不符,有人可以帮助我吗?我会感谢您的帮助。

【问题讨论】:

标签: sql sql-server xquery xquery-sql


【解决方案1】:

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

【讨论】:

  • @AgusmanPriantoro 欢迎您。由于您迄今为止从未这样做过,如果它解决了相关问题,我会提醒您考虑accepting an answer
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2020-09-29
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多