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

Tsql 如何编写查询以删除重复行?,tsql,uniqueidentifier,Tsql,Uniqueidentifier,我使用的是ssms2008r2,我有一个表,其中有两个uniqueidentifier列,它们是彼此的镜像。如何删除重复的行 e、 g.我有一张桌子,上面有: ColA ColB ColC ColD ABCD EFGH 4 5 EFGH ABCD 5 4 所以ColA和ColB是两个唯一标识符列,而ColC和ColD属于ColA和ColB。因此,如果我将其分解为单独的事件,这将看起

我使用的是ssms2008r2,我有一个表,其中有两个uniqueidentifier列,它们是彼此的镜像。如何删除重复的行

e、 g.我有一张桌子,上面有:

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

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

您不必输入
类型
列,但我认为,如果您能够了解添加它如何在正确规范化数据时保持数据的意义,这将非常有用

如果没有更多关于您的数据和您试图实现的目标的信息,我无法提供更多的指导


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

所需的输出是什么?听起来好像您不想删除,即
删除
,任何内容,也不涉及重复行。你能把标题改得更准确一点吗?你的编辑毫无意义。您想交换
ColB
ColC
的内容吗?非常感谢您的帮助,但实际上我正试图在一行中获得所有这些信息。我现在将更新我的描述,以向您展示我的意思。当我运行上面的第二个查询时,它分别为我提供了每一行,而不是删除重复项。您是否尝试了第一个查询?它确实给出了一行?没错,第二行给出了两行,每个代码一行(但它不会两次显示每个代码)。考虑到问题的模糊性,我猜你想要什么。但是,我相信我的第一个查询将提供您所需要的,只要您正确地实现它,并注意到
交叉应用
中的两行具有不同的列引用顺序。此外,根据您的数据(我不知道真正的数据是什么,因为您已经模糊了它),您可以使用第二个查询,然后
PIVOT
——如果您实际处理的是两个以上的列需要检测为相同,那么这可能会更好(但在这种情况下,您的问题需要更新以表明这一点)。如果真的只有两(组)列需要比较,那么我在第一次查询中显示的内容将非常有效。
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
;
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)
;