2010-12-08 38 views
1

我想运行一个SQL语句,将只删除第二个值例如吨-SQL - 删除第二个值仅

delete from table1 where condition1 

我想这种说法只删除第二个值

如何我能完成这个吗?

我想澄清一下。我有一个名为field1的字段,它是一个自动编号,并且它是一个主键,它会递增。我想删除包含更多数量的

+0

你如何确定哪个值来自“第一”,哪个值来自“第二”? – 2010-12-08 20:59:51

+2

这是否意味着清除重复条目?这看起来很像。 – guildsbounty 2010-12-08 21:01:37

+0

@anon谢谢我已澄清 – 2010-12-08 21:03:17

回答

3

您也可以使用SQL服务器的ROW_NUMBER()函数对每一行进行编号,并根据您在内部查询(over (ORDER BY <myKey> asc))中的自定义排序,使用此编号隔离第二个要删除的项目。这提供了很大的灵活性。

DELETE a FROM table1 
FROM table1 a 
JOIN (
     select ROW_NUMBER() over (ORDER BY <myKey> asc) as AutoNumber, <myKey> from table1 
) b on a.<myKey> = b.<myKey> 
WHERE condition1 
AND b.AutoNumber = 2 
0

试试这个记录:

DELETE MyTable 
FROM MyTable 
LEFT OUTER JOIN (
    SELECT MIN(id) as id, Col1, Col2, Col3 
    FROM MyTable 
    GROUP BY Col1, Col2, Col3 
) as KeepRows ON 
    MyTable.id= KeepRows.id 
WHERE 
    KeepRows.RowId IS NULL 

UPDATE

虽然这可能不会像“漂亮”为@杰弗里的工作原理。据我所知,@ Jeffrey's没有。请参阅下面的SQL(删除与SELECT *取代了演示):

WITH TEMP as 
(
    SELECT 1 as id,'A' as a,'Z' as b 
    UNION 
    SELECT 2,'A','Z' 
    UNION 
    SELECT 3,'B','Z' 
    UNION 
    SELECT 4,'B','Z' 
) 

SELECT * 
FROM TEMP 
LEFT OUTER JOIN (
    SELECT MIN(id) as id, a, b 
    FROM TEMP 
    GROUP BY a, b 
) as KeepRows ON 
    temp.id= KeepRows.id 
WHERE 
    KeepRows.id IS NULL 
+0

DELETE MyTable FROM MyTable ?? – 2010-12-08 21:05:09

0

它已经有一段时间(所以我的语法我不太是正确的),而这可能不是最好的解决办法,但“学术”的答案会是这样的:

delete from table1 where condition1 
and field1 = (select max(field1) from table1 where condition1) 
1

是否只想删除最后一个副本,或者只删除第一个副本?

为所有,但第一种:(编辑使用CTE每@马丁的建议

with target as (select * from table1 where condition1) 
delete from target goner 
where exists (select * from target keeper 
       where keeper.field1 < goner.field1) 

换句话说,如果以较低的field1的另一个匹配的记录,删除该记录。

编辑: 只删除最后:

with target as (select * from table1 where condition1) 
delete from target goner 
where exists (select * from target keeper 
       where keeper.field1 < goner.field1) 
    and not exists (select * from target missing 
        where missing.field1 > goner.field1) 

换句话说,如果以较低的field1的另一个匹配的记录,并有具有较高FIELD1没有匹配的记录,那么我们有最高的重复,所以核弹它。