如何编写查询以删除重复行?

How to write a query to remove duplicate rows?

我使用的是 SSMS 2008R2,我有一个 table,它有 2 个互为镜像的 uniqueidentifier 列。如何删除重复的行?

例如我有一个 table 具有以下内容:

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

所以 ColA 和 ColB 是两个 uniqueidentifier 列,而 ColC 和 ColD 属于 ColA 和 ColB。所以如果我把它分解成单独的事件,它看起来像:

ABCD -> 4
EFGH -> 5

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

ColA    ColB    ColC    ColD
ABCD    4       EFGH    5

要隐藏行之间的差异,让它们大部分保持不变,您可以这样做(对列进行排序,使它们按相同的顺序排列,允许使用 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 列,但我认为这对您了解添加它如何有助于在正确规范化后保持数据的意义会很有用。

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

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