【问题标题】:How to write a query to remove duplicate rows?如何编写查询以删除重复行?
【发布时间】:2015-12-07 21:48:48
【问题描述】:

我正在使用 SSMS 2008R2,并且我有一个表,其中包含 2 个唯一标识符列,它们是彼此的镜像。如何删除重复的行?

例如我有一张桌子,上面有以下内容:

ColA      ColB       ColC       ColD
ABCD      EFGH       4          5
EFGH      ABCD       5          4

所以 ColA 和 ColB 是两个唯一标识符列,而 ColC 和 ColD 属于 ColA 和 ColB。因此,如果我将其分解为单独的事件,则如下所示:

ABCD -> 4
EFGH -> 5

如何在一行而不是两行中列出所有这些信息? 这就是我希望上面的样子:

ColA    ColB    ColC    ColD
ABCD    4       EFGH    5

【问题讨论】:

  • 期望的输出是什么?
  • 听起来你不想删除,即delete,任何东西,也不涉及重复的行。你能把标题改写得更准确一点吗?
  • 您的编辑毫无意义。你想交换ColBColC 的内容吗?

标签: tsql uniqueidentifier


【解决方案1】:

要隐藏行之间的差异,而它们大部分保持不变,您可以这样做(对列进行排序,使它们处于相同的顺序,允许使用 DISTINCT 隐藏重复项):

SELECT DISTINCT
   t2.*
FROM
   dbo.YourTable t
   CROSS APPLY (
       SELECT t.ColA, t.ColB, t.ColC, t.ColD WHERE t.ColA <= t.ColB
       -- Note: this next SELECT has the columns in a different order!
       UNION ALL SELECT t.ColB, t.ColA, t.ColD, t.ColC WHERE t.ColA > t.ColB
   ) t2
;

如果ColAColB 可以有NULL 值,这将无法正常工作。

但您似乎想做一个多列反透视,其中 ColA 和 ColC 的关系与 ColB 和 ColC 没有任何特定关系(可能除了一些关键列,可以根据需要包含),一些像这样:

SELECT -- can do DISTINCT if you remove the Type column
   c.Type,
   c.Code,
   c.Value
FROM
   dbo.YourTable t
   CROSS APPLY (
      SELECT 'ColA', t.ColA, t.ColC
      UNION ALL SELECT 'ColB', t.ColB, t.ColD
   ) c (Type, Code, Value)
;

您不必将Type 列放入其中,但我认为您可以了解添加它如何有助于在正确规范化后保持数据的含义。

如果没有关于您的数据和您想要完成的任务的更多信息,我无法提供更多指导。

我认为,如果您将独立事件存储在多个列中,那么数据库设计不是最理想的,需要进行规范化——这些数据应该存储在行中,而不是列中,因为我的第二个查询将数据转换为.

【讨论】:

  • 非常感谢您的帮助,但实际上我只是想在一行中获取所有这些信息。我现在将更新我的描述以向您展示我的意思
  • 当我在上面运行您的第二个查询时,它分别给了我每一行而不是删除重复项。
  • 您是否尝试了第一个查询?它确实给出了一行...?
  • 你是对的,第二个给出了两行,每个代码一个(但它不会显示每个代码两次)。鉴于问题的模糊性,这是我对您想要什么的猜测之一。但是,我相信我的第一个查询提供您需要的内容,只要您正确实现它并注意到CROSS APPLY 内的两行的列引用顺序不同。跨度>
  • 另外,根据您的数据(我不知道真实数据是什么,因为您已将其隐藏),您可以使用第二个查询,然后 PIVOT--如果您实际上正在处理两个以上需要检测为相同的列(但在这种情况下,您的问题需要更新以表明这一点)。如果真的只有两(组)列需要比较,那么我在第一个查询中显示的内容将非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
相关资源
最近更新 更多