Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2011, 10h59   #1
Membre régulier
 
Inscription : septembre 2007
Messages : 119
Détails du profil
Informations personnelles :
Localisation : Jamaïque

Informations forums :
Inscription : septembre 2007
Messages : 119
Points : 72
Points : 72
Par défaut [SQL Server 2005] Delete avec conditions

Bonjour,

Je souhaite supprimer toutes les lignes d'une table qui ne sont pas en double (sur deux champs)

Table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE [dbo].[ItemPackagingSplit](
	[ItemNo] [varchar](20) NOT NULL,
	[LogisticType] [varchar](10) NOT NULL,
	[SplitPackagingNo] [varchar](10) NOT NULL,
	[PackagingDescription] [varchar](30) NOT NULL,
	[MainValue] [tinyint] NOT NULL,
	[BarCodeToCreate] [tinyint] NULL,
 CONSTRAINT [PK_ItemPackagingSplit] PRIMARY KEY CLUSTERED 
(
	[ItemNo] ASC,
	[LogisticType] ASC,
	[SplitPackagingNo] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
je cherche a completer la requete suivante :

Code :
1
2
3
4
5
6
7
delete  from ItemPackagingSplit 
 where [ItemNo],[LogisticType] IN
	(select  [ItemNo],[LogisticType] 
	from ItemPackagingSplit  
	group by [ItemNo], [LogisticType]
	HAVING COUNT(*)<2)
Cette requete ne marche bien sur pas (sinon je ne serais pas la ).

Sauriez vous me dire comment supprimer tous les lignes de ma table qui réponde à la condition suivante ?
Code :
1
2
3
4
5
 
SELECT  [ItemNo],[LogisticType] 
	FROM ItemPackagingSplit  
	GROUP BY [ItemNo], [LogisticType]
	HAVING COUNT(*)<2
dkmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 14h42   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonjour,

Si vous avez une version de SQL Server en 2005 ou +, une solution peut être la suivante :

Code :
1
2
3
4
5
6
7
8
9
WITH records_delete
AS
(
	SELECT ROW_NUMBER() OVER (PARTITION BY [ItemNo], [LogisticType] ORDER BY [ItemNo], [LogisticType]) AS num,
	*
	FROM [ItemPackagingSplit]
)
DELETE FROM records_delete
WHERE num > 1;
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 14h58   #3
Membre régulier
 
Inscription : septembre 2007
Messages : 119
Détails du profil
Informations personnelles :
Localisation : Jamaïque

Informations forums :
Inscription : septembre 2007
Messages : 119
Points : 72
Points : 72
Merci pour la réponse, je ne comprends pas tout de ce script... mais je pense que çà ne fonctionne pas :

Avec :
Code :
1
2
3
4
5
6
 
 
SELECT  [ItemNo],[LogisticType] 
	FROM ItemPackagingSplit  
	GROUP BY [ItemNo], [LogisticType]
	HAVING COUNT(*)<2
Je retourne 1449 lignes

et avec
Code :
1
2
3
4
5
6
7
8
9
10
 
WITH records_delete
AS
(
	SELECT ROW_NUMBER() OVER (PARTITION BY [ItemNo], [LogisticType] ORDER BY [ItemNo], [LogisticType]) AS num,
	*
	FROM [ItemPackagingSplit]
)
SELECT * FROM records_delete
WHERE num > 1;
Je retourne 2735 lignes
dkmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h24   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Le script que je vous ai fourni permet de faire directement une mise à jour depuis une CTE de vos données dans la table cible .. fonctionnalité intéressante des CTE d'ailleurs.

Vous n'avez pas le même nombre de lignes parce que vous ne posez pas la même question à chaque fois

Script TSQL 1 : Retourne moi le nombre de lignes pour [ItemNo],[LogisticType] sans doublon uniquement (HAVING COUNT(*) < 2

Script TSQL 2 : Retourne moi le nombre de lignes pour [ItemNo],[LogisticType] qui possède forcement un doublon (num > 1)

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h36   #5
Membre régulier
 
Inscription : septembre 2007
Messages : 119
Détails du profil
Informations personnelles :
Localisation : Jamaïque

Informations forums :
Inscription : septembre 2007
Messages : 119
Points : 72
Points : 72
Je veux ne garder que les doublons (et plus 3,4)
dkmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 16h05   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Autant pour moi .. mal lu votre problème ..

Code :
1
2
3
4
5
6
7
8
DELETE FROM [ItemPackagingSplit] 
FROM [ItemPackagingSplit] AS IS1
INNER JOIN (SELECT [ItemNo], [LogisticType]
			  FROM [ItemPackagingSplit]
              GROUP BY [ItemNo], [LogisticType]
			  HAVING COUNT(*) = 1) AS IS2
ON IS2.[ItemNo] = IS1.[ItemNo]
 AND IS2.[LogisticType] = IS1.[LogisticType]
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 17h36   #7
Membre régulier
 
Inscription : septembre 2007
Messages : 119
Détails du profil
Informations personnelles :
Localisation : Jamaïque

Informations forums :
Inscription : septembre 2007
Messages : 119
Points : 72
Points : 72
Ca marche nikel merci!
dkmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h05.


 
 
 
 
Partenaires

Hébergement Web