IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[SQL Server 2005] Delete avec conditions


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select  [ItemNo],[LogisticType] 
    	from ItemPackagingSplit  
    	group by [ItemNo], [LogisticType]
    	HAVING COUNT(*)<2

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    ++

  3. #3
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Merci pour la réponse, je ne comprends pas tout de ce script... mais je pense que çà ne fonctionne pas :

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    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)

    ++

  5. #5
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Je veux ne garder que les doublons (et plus 3,4)

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Autant pour moi .. mal lu votre problème ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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]
    ++

  7. #7
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Ca marche nikel merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL Server CE] DELETE avec jointure
    Par Nico57 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/02/2008, 17h03
  2. [SQL SERVER 2005] PB avec SP2
    Par freud dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 28/11/2007, 11h03
  3. [SQL SERVER 2005] erreur avec sessions
    Par barnet dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/06/2007, 18h16
  4. [SQL Server 2005] DELETE sur des doublons
    Par Shakta dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/05/2007, 11h13
  5. Connection de SQL SERVER 2005 EXPRESS avec HIBERNATE
    Par jerome giraud dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/02/2006, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo