SQL中的条件删除?

pgu*_*ton 1 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 |
+------------+---------+
Run Code Online (Sandbox Code Playgroud)

在满足以下条件的情况下,如何删除Rev Code为3的所有行项目:
类别的Rev Code为'2'和'3'。

例如:

+-----------+---------+
| Category  | RevCode |
+-----------+---------+
| 100.10.10 |       2 |
| 100.10.10 |       3 |
+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

上表将变为:

+-----------+---------+
| Category  | RevCode |
+-----------+---------+
| 100.10.10 |       2 |
+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

Jau*_*ang 5

您可以将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 )
Run Code Online (Sandbox Code Playgroud)

该语句可能效率不高,可以使用exist子句代替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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)