SQL中的条件删除?

时间:2014-07-30 01:49:03

标签: sql sql-server delete-row

请参阅下面的SQL表:

+------------+---------+
|  Category  | RevCode |
+------------+---------+
| 100.10.10  |       2 |
| 100.10.10  |       3 |
| 100.50.10  |       2 |
| 100.50.15  |       2 |
| 100.50.15  |       3 |
| 1000.80.10 |       3 |
| 200.10.10  |       3 |
| 200.50.10  |       3 |
| 200.80.10  |       3 |
| 2000.20.10 |       2 |
| 2000.20.10 |       3 |
| 2000.20.20 |       2 |
| 2000.20.20 |       3 |
| 2000.20.30 |       2 |
+------------+---------+

如何在符合以下条件的情况下删除Rev代码为3的所有订单项:
类别的Rev代码均为' 2'和' 3'。

例如:

+-----------+---------+
| Category  | RevCode |
+-----------+---------+
| 100.10.10 |       2 |
| 100.10.10 |       3 |
+-----------+---------+

上表将成为:

+-----------+---------+
| Category  | RevCode |
+-----------+---------+
| 100.10.10 |       2 |
+-----------+---------+

2 个答案:

答案 0 :(得分:4)

您可以将sub_query与having子句一起使用:

delete from del_table
where RevCode = '3' 
  and  Category  in 
    (select Category from del_table 
     where RevCode in ('2','3')
     group by Category 
     having count(distinct RevCode) =2 )

此语句可能效率不高,您可以使用exists子句而不是in子句。

感谢Charlesliam的评论。我使用sql fiddle测试了两种情况。

案例1:

create table del_table(Category varchar(20),RevCode Int);
INSERT INTO  del_table VALUES 
('100.10.10',2 ),
('100.10.10',3 ),
('100.50.10',2 ),
('100.50.15',3 )

result after deletion:
CATEGORY    REVCODE
100.10.10   2
100.50.10   2
100.50.15   3

case2(一个类别包含两行以上且具有重复的RevCode):

create table del_table(Category varchar(20),RevCode Int);
INSERT INTO  del_table VALUES 
('100.10.10',2 ),
('100.10.10',2 ),
('100.10.10',3 ),
('100.10.10',3 ),
('100.50.10',2 ),
('100.50.15',3 )

result after deletion:
CATEGORY    REVCODE
100.10.10   2
100.10.10   2
100.50.10   2
100.50.15   3

答案 1 :(得分:1)

看看这对你有帮助。

DECLARE @A TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, CATEGORY VARCHAR(20),REVCODE INT)
INSERT INTO @A VALUES 
('100.10.10',2 ),
('100.10.10',3 ),
('100.50.10',2 ),
('100.50.15',2 ),
('100.50.15',3 ),
('1000.80.10',3),
('200.10.10',3 ),
('200.50.10',3 ),
('200.80.10',3 ),
('2000.20.10',2),
('2000.20.10',3),
('2000.20.20',2),
('2000.20.20',3),
('2000.20.30',2)

SELECT * FROM @A

表:

enter image description here

查询:

DELETE  LU
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY CATEGORY ORDER BY REVCODE) ROW 
        FROM    @A A
        WHERE   A.REVCODE IN (2,3)
        ) LU
WHERE   LU.ROW = 2

SELECT * FROM @A

结果:

enter image description here