首页 > 解决方案 > 如何使用 SQL DISTINCT 从多个列中删除重复项?

问题描述

假设我有一张包含很多重复值的表。我想单独删除每列的重复项。使用DISTINCT删除列的重复组合,因此其他列仍包含重复值。

原表为:

Col1 | Col2 | Col3    
-----+------+------
 a1  | b1   | c1    
 a1  | b2   | c1
 a2  | b1   | NULL
 a2  | b2   | c1    
 a3  | b1   | c1
 a3  | NULL | NULL

我想要的结果是:

Col1 | Col2 | Col3    
-----+------+------
 a1  | b1   | c1    
 a2  | b2   | NULL    
 a3  | NULL | NULL

我可以通过几个查询分别得到这个结果:

SELECT DISTINCT Col1 
FROM TABLE

SELECT DISTINCT Col2 
FROM TABLE

SELECT DISTINCT Col3 
FROM TABLE

但是如何在单个查询中执行此操作并在一个结果集中返回结果?

谢谢

标签: sqldistinct

解决方案


我会用一个group by...

;WITH c1 AS (
    SELECT col1
         , ROW_NUMBER() OVER (ORDER BY col1) AS [r]
      FROM #foo
     WHERE col1 IS NOT NULL
     GROUP BY col1
)
, c2 AS (
    SELECT col2
         , ROW_NUMBER() OVER (ORDER BY col2) as [r]
      FROM #foo
     WHERE col2 IS NOT NULL
     GROUP BY col2
)
, c3 AS (
    SELECT col3
         , ROW_NUMBER() OVER (ORDER BY col3) as [r]
      FROM #foo
     WHERE col3 IS NOT NULL
     GROUP BY col3
)
select c1.col1
     , c2.col2
     , c3.col3
  from c1 LEFT join c2
        on c1.r = c2.r
       left join c3
        on c1.r = c3.r
 ORDER BY c1.r ASC;

从问题描述中我不太确定您想要什么。我根据提供的理想输出制作了这个。

这是我使用的示例数据集。

CREATE TABLE #foo (
    col1 char(2)
  , col2 char(2)
  , col3 char(2)
);

INSERT INTO #foo (col1, col2, col3)
VALUES ('a1', 'b2', null)
     , ('a1', 'b1', 'c1')
     , ('a2', Null, 'c1')
     , ('a2', 'b1', null)
     , ('a3', null, 'c1')
GO

这是查询的数据集和输出:

在此处输入图像描述

希望这可以帮助!


推荐阅读