Tsql 如何编写查询以删除重复行?
我使用的是ssms2008r2,我有一个表,其中有两个uniqueidentifier列,它们是彼此的镜像。如何删除重复的行 e、 g.我有一张桌子,上面有: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。因此,如果我将其分解为单独的事件,这将看起
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)
;