我正在使用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
答案 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>
如果没有关于您的数据的更多信息以及您尝试完成的内容,我无法提供更多指导。
我认为如果你在多个列中存储独立事件,那么数据库设计是次优的并且需要规范化 - 这个数据应该存储在行而不是列中,因为我的第二个查询转换了数据到。