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

时间:2015-12-07 21:48:48

标签: tsql uniqueidentifier

我正在使用SSMS 2008R2,我有一个表有2个uniqueidentifier列,它们是彼此的镜像。如何删除重复的行?

e.g。我有一张表格如下:

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

1 个答案:

答案 0 :(得分:1)

要隐藏行之间的差异并保持大部分不受影响,您可以执行此操作(对列进行排序,使它们的顺序相同,允许使用select distinct(fid), pid , count(pid) from table1 隐藏重复项):

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 ; ColA可以有ColB值,这将无效。

但似乎你想做一个多列的转移,其中ColA和ColC的关系与ColB和ColC没有任何特定的关系(除了一些关键的列,可能是根据需要包括),像这样:

NULL

您不必将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) ; 列放入其中,但我认为在您正确规范化时,添加它有助于保持数据的意义对您有用。 / p>

如果没有关于您的数据的更多信息以及您尝试完成的内容,我无法提供更多指导。

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