Suppression conditionnelle dans SQL?

Voir le tableau SQL ci-dessous:

+------------+---------+ | 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 | +------------+---------+ 

Comment puis-je supprimer tous les éléments de campagne avec le code de révocation de 3 lorsque la condition suivante est remplie:
Une catégorie a un code de rév. De '2' et de '3'.

Par exemple:

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

Le tableau ci-dessus deviendra:

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

Vous pouvez utiliser sub_query avec la clause having comme ceci:

 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 ) 

cette instruction peut ne pas être efficace, vous pouvez utiliser la clause exists au lieu de in clause.

Merci pour le commentaire de Charlesliam. J'utilise sql fiddle testé deux cas ci-dessous.

cas 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 (une catégorie a plus de deux lignes avec RevCode en double):

 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 

Voyez si cela vous aide.

 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 

Table:

entrez la description de l'image ici

Question:

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

Résultat:

entrez la description de l'image ici