2011-09-16 58 views
3

可能重复:
Delete duplicate records from a SQL table without a primary key重复删除

我有数据:

SELECT 
      a 
     , b 
    FROM 
    (
     select a = 1, b = 30 
     union all 
     select a = 2, b = 50 
     union all 
     select a = 3, b = 50 
     union all 
     select a = 4, b = 50 
     union all 
     select a = 5, b = 60 
    ) t 

我有一个)dublicate记录,以获取输出(下一个(顺序应从结果集中排除):

a   b 
----------- ----------- 
1   30 
2   50 
3   50 -- should be excluded 
4   50 -- should be excluded 
5   60 
+1

所以,问题是比'选择分钟(一)更加复杂,B 从... 组由B'? - 因为这将与您的示例数据 – antlersoft

+0

@antlersoft一起工作,这已经足够了。我有:a是int并且b是唯一标识符,所以它也可以工作。谢谢。 – garik

回答

4
SELECT 
      min(a) as a 
     , b 
    FROM 
    (
     select a = 1, b = 30 
     union all 
     select a = 2, b = 50 
     union all 
     select a = 3, b = 50 
     union all 
     select a = 4, b = 50 
     union all 
     select a = 5, b = 60 
    ) t 
GROUP BY b  
ORDER BY a 
+1

如果有非数字条目会怎么样? – Pepe

+0

@ P.R - 你应该仍然可以使用'min()'。 –

+0

它崩溃,并说它无法转换为数字(我在MS上试过) – Pepe

1

在oracle中我能够做到这一点使用GROUP BY子句,你应该能够做到类似。

select min(a), b 
from (select 1 a, 30 b 
     from dual 
     union all 
     select 2 a, 50 b 
     from dual 
     union all 
     select 3 a, 50 b 
     from dual 
     union all 
     select 4 a, 50 b 
     from dual 
     union all 
     select 5 a, 60 b from dual) 
group by b; 

编辑:看起来像其他人想出了一个MS SQL的解决方案,我会在这里虽然离开这个给后人。

1

做到这一点,最简单的方法是用一个简单的GROUP BY

SELECT 
     a 
    , b 
INTO #tmp 
FROM 

(
    select a = 1, b = 30 
    union all 
    select a = 2, b = 50 
    union all 
    select a = 3, b = 50 
    union all 
    select a = 4, b = 50 
    union all 
    select a = 5, b = 60 
) t 


SELECT DISTINCT MIN(a) AS a,b 
FROM #tmp 
GROUP BY b 
ORDER BY a 
+1

独特不会做任何事情,因为你正在按b分组并且在a上使用aggegate,每一行都已经被升级为独特。 – TimothyAWiseman