1
votes

Supprimer SQL avec clause group by

Je veux écrire une commande SQL qui supprimera toutes les lignes avec un 0 comme dernier chiffre d'une colonne, puis un 1 comme dernier chiffre, un 2 comme dernier chiffre, et ainsi de suite.

delete from BASE_TABLE
where BASE_TABLE.SET = 'ABCD'
and BASE_TABLE.TAG LIKE '%0'


0 commentaires

3 Réponses :


1
votes

Si vous ne vous souciez que de la charge du système, supprimez simplement les X premières lignes. Voici la syntaxe

DELETE TOP (top_value) [ PERCENT ] 
FROM table
[WHERE conditions];

Vous pouvez appliquer un ordre par si vous souhaitez supprimer dans un certain ordre. Si vous voulez que le processus fasse tout le travail pour vous, collez-le en boucle jusqu'à ce que la table soit vide.


0 commentaires

4
votes

Vous pouvez le faire dans une boucle while . Cependant, une approche plus typique serait:

declare @x int;
set @x = 1;

while @x > 0 begin
    delete top 1000 from BASE_TABLE
    where BASE_TABLE.SET = 'ABCD';

    set @x = @@ROWCOUNT;
end;

Ou simplement un nombre fixe que vous pouvez gérer:

delete top 1000 from BASE_TABLE
where BASE_TABLE.SET = 'ABCD';

Vous pouvez alors mettre ceci dans une boucle:

delete top 10 percent from BASE_TABLE
where BASE_TABLE.SET = 'ABCD';

Ne mettez pas la méthode percent dans la boucle while . Cela continuera pendant longtemps - car le pourcentage est basé sur les lignes du tableau à ce moment-là. Je pense que cela supprimera finalement la dernière ligne, mais il y aura beaucoup d'itérations.


6 commentaires

C'est une approche très intéressante. Je vais essayer quelque chose comme ça et voir si ça marche pour moi. Je publierai ici et sélectionnerai bientôt la bonne réponse. Je suis sûr que BASE_TABLE.TAG est toujours numérique, pensez-vous que je devrais toujours en tenir compte?


@Larnu. . . Cette condition ne figure pas dans l'instruction delete d'origine.


Désolé pour la confusion dans la deuxième déclaration, je devrais peut-être modifier le message pour plus de clarté. La deuxième déclaration était juste un exemple de la façon dont je pensais résoudre le problème


Si j'adoptais l'approche des 10 pourcentages les plus importants , est-ce que tous les enregistrements seraient finalement supprimés? ou 10% à la fois jusqu'à ce que 100% des lignes soient supprimées? Essayant d'enrouler ma tête autour de celui-là


@Josh . . . Cette version ne devrait pas aller en boucle. . . ceci est lié au paradoxe de Zero ( en.wikipedia.org/wiki/Zeno%27s_paradoxes ).


@GordonLinoff Correct, je voulais dire la première déclaration que vous avez fournie, supprimez les 10 pour cent supérieurs de BASE_TABLE où BASE_TABLE.SET = 'ABCD';



1
votes

Vous avez besoin de [0-9]% dans la clause where

Cela supprimera toutes les lignes commençant par 0 à 9 et si vous voulez terminer par décaler le % vers la gauche comme %[0-9


5 commentaires

Cela va-t-il parcourir ces nombres ou supprimer tout ce qui a un dernier chiffre entre 0 et 9?


De toute évidence, il doit itérer pour supprimer ces lignes une par une, mais c'est implicite


Je voulais dire que cela supprimera tout avec 0, puis 1, puis 2, etc.? Ce n'est pas si évident pour moi, d'où la raison pour laquelle je pose la question lol


lisez attentivement ma réponse d'abord et ne pensez-vous pas comment vous effectuez sélectionnez des données via comme % .. c'est de la même façon que cela supprimera également à condition que la colonne que vous avez mentionnée soit valide.


Je ne pense pas que cela fasse ce que je veux, je voudrais qu'il supprime les lignes avec 0-9 dans des instructions SQL apparemment séparées. Supprime tous les 0, puis supprime tous les 1, jusqu'à ce que toutes les lignes soient dans un style en boucle