134 votes

Comment supprimer d'une table où l'ID est dans une liste d'ID ?

Si j'ai une liste d'ID (1,4,6,7) et une table de base de données où je veux supprimer tous les enregistrements dont l'ID est dans cette liste, comment faire ?

260voto

Matti Virkkunen Points 31633

Votre question est presque le SQL pour cela :

DELETE FROM table WHERE id IN (1, 4, 6, 7)

0 votes

@jayarjo : Toute différence serait probablement tout à fait négligeable, et je ne pense pas qu'il y ait une raison pour que la suppression un par un soit plus efficace de toute façon.

0 votes

C'est juste là où la performance peut être une commodité. Par exemple, j'ai déjà des fonctions pour le faire un par un en place. Mais s'il y avait une chance d'augmenter les performances, je pourrais écrire du code supplémentaire, sinon ça ne vaudrait probablement pas la peine.

10 votes

Un par un serait presque certainement plus lent, certainement sur Oracle ou PostgreSQL. Le fractionnement des opérations SQL en de nombreuses opérations plus petites est un excellent moyen d'obtenir de mauvaises performances.

19voto

Carl Manaster Points 23696
delete from t
where id in (1, 4, 6, 7)

-6voto

Erwin Smout Points 7499

La réponse correcte est que la vitesse dépend des caractéristiques de l'implémentation/du moteur particulier que vous utilisez, et que vous devriez vous méfier de tout charlatan qui prétend être capable de donner une réponse définitive à cette question.

Si l'optimiseur de votre système est si mauvais qu'il ne repère pas l'opportunité d'optimisation à partir de 'WHERE id IN (...)', il effectuera un balayage de la table, ce qui pourrait être beaucoup plus lent que de donner 4 commandes de suppression distinctes.

-7voto

Bernard Oreva Points 94
        CREATE FUNCTION dbo.func_SplitString
        (    
            @Input NVARCHAR(MAX),
            @Character CHAR(1)
        )
        RETURNS @Output TABLE (
            Item NVARCHAR(1000)
        )
        AS
        BEGIN
            DECLARE @StartIndex INT, @EndIndex INT;

            SET @StartIndex = 1;

            --ADD THE SEPERATING CHARACTER AT THE END OF THE STRING FOR LOOP PURPOSE

            IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
            BEGIN
                SET @Input = @Input + @Character;
            END

            -- LOOP AS LONG AS THE SEPARATOR EXISTS IN THE STRING

            WHILE CHARINDEX(@Character, @Input) > 0
            BEGIN
                -- GET INDEX OF THE SEPARATOR (THIS INDICATES AN ITEM WE CAN TAKE OFF THE STRING)

                SET @EndIndex = CHARINDEX(@Character, @Input);

                -- INSERT ITEM INTO TEMP TABLE

                INSERT INTO @Output(Item)
                SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1);

                -- REMOVE ITEM FROM ORIGINAL STRING ALONG WITH THE SEPARATOR WE HAVE JUST WORKED WITH

                -- THIS REMOVES THE ITEM AFTER ADDING IT TO THE TEMP TABLE ALONG WITH THE SEPARATOR FOR THE ITEM
                -- UNTIL THERE IS NO SEPARATOR ANYMORE IN THE ORIGINAL STRING

                SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input));
            END

            RETURN
        END
        GO

\========= UTILISER LA FONCTION POUR EFFECTUER UNE OPÉRATION DE SUPPRESSION DE CETTE MANIÈRE ==========

     DECLARE @ListOfIDs varchar(100);

     SET @ListOfIDs = '100,200,300,400,500';

     DELETE FROM [dbo].[tableContainingDataToDelete]
     WHERE 
     ID IN(SELECT CAST(Item AS int)
     FROM dbo.func_SplitString(@ListOfIDs , ','));

\========= J'espère que cela vous aidera (sourires) ========

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X