【问题标题】:SQL Server : sorting a distinct table which has XML columnSQL Server:对具有 XML 列的不同表进行排序
【发布时间】:2017-05-27 14:26:15
【问题描述】:

我有一张表,我需要对其进行区分,因为它有一些重复项,然后需要对其进行排序并将 XML 加入一列。

这是我尝试过的:

Select * 
From TableA
Where TableID ='1234'
  And Convert(nvarchar(max), xmlcolumn) in (Select Distinct Convert(nvarchar(max), xmlcolumn))

上面确实为我整理了列表,也没有删除重复项。

Select distinct convert (nvarchar(max), xmlcolumn)
From TableA
Where TableID ='1234'
Order By TableID

上面返回了所需的内容,但是如果我按(如上所示)进行订购,则会出现错误:

如果指定了选择地区,则必须按项目排序

我不想在 select 语句中输入 TableID,因为我不想在结果中出现这个。其次,如何将 XML(转换为 nvarchar 以执行不同的操作)转换回 XML 以导出到 C#。

【问题讨论】:

  • 为什么还需要Order by TableIdTableId = '1234'
  • 该表包含大量数据,我可以使用 TableID 选择这些数据。例如,SO 表 ID 1234包含 600 个条目,我需要提取 XMLcolumn
  • Order by 不会更改您采用的行数。它只是按指定的列列表对结果集进行排序。错误信息很清楚,如果您使用distinct 关键字,那么order by 子句中的所有列必须存在于您选择的列中。在您的情况下,只需删除 Order by TableId 或将其更改为 Order by anyselectedcolumn
  • 我需要按结果中不需要的列排序。例如。列 A、XML 列、列 B。现在列 a 有一个数字 1234,其行分别由 COlumn B 和 XML 列共享。现在我需要通过 1234 进行选择,因为我可以看到重复项。然后对 XML 列进行排序并导出到 C#。我只能按 ColumnA 或 ColumnB 订购 XML。但我不需要结果中的这些列。我希望我足够清楚
  • 有人可以删除否决票吗?这是一个有效的问题

标签: c# sql sql-server xml


【解决方案1】:

如果我理解正确,您可以像这样使用ROW_NUMBER 删除重复行

DECLARE @SampleData AS TABLE
(
    TableID varchar(10),
    ColumnA int,
    ColumnB varchar(10),
    XmlColumn xml   
)

;WITH temp AS
(
    SELECT sd.TableID,
           CAST(sd.XmlColumn AS nvarchar(max)) AS XmlColumn,
           ROW_NUMBER() OVER(PARTITION BY CAST(sd.XmlColumn AS nvarchar(max)) ORDER BY sd.TableID) AS Rn
    FROM @SampleData sd 
    Where TableID = '1234' 
)
SELECT t.XmlColumn 
FROM temp t
WHERE Rn = 1 -- remove duplicate rows
ORDER BY t.TableID -- order by any columns 

【讨论】:

  • 此查询有效,但必须稍作修改。在这里,您正在执行 CTE 并从该 CTE 本身中进行选择,因此结果为空。我复制了这个查询,并在 CTE 之后的选择查询中修改了选择以指向我需要从中获取表的原始表。所以它工作的。因此+1并接受答案。谢谢,很抱歉在城外回复晚了。
  • 我不懂 RN 的概念,你能不能简单解释一下 RN 如何帮助摆脱重复的。
  • 你可以阅读这个docs.microsoft.com/en-us/sql/t-sql/functions/…PARTITION BY 表示按XmlColumn 分组,则只取该组的第一行(Rn = 1)。当然,对于每个XmlColumn,它都是唯一的
  • 谢谢@TriV,非常感谢。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-09-16
  • 2021-02-12
相关资源
最近更新 更多