Usuń wszystkie oprócz top n z tabeli bazy danych w SQL

Jaki jest najlepszy sposób, aby usunąć wszystkie wiersze z tabeli w sql, ale aby zachować n liczba wierszy na górze?

 71
sql
Author: Riri, 2008-09-05

9 answers

DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)

Edit:

Chris przynosi dobre wyniki, ponieważ pierwsze 10 zapytań byłoby uruchamiane dla każdego wiersza. Jeśli jest to rzecz jednorazowa, to może nie jest to tak wielka sprawa, ale jeśli jest to rzecz powszechna, to przyjrzałem się jej bliżej.

 64
Author: Cory Foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 08:28:05

Wybrałbym kolumnę (y) ID zestawu wierszy, które chcesz zachować w tabeli tymczasowej lub zmiennej table. Następnie usuń wszystkie wiersze, które nie istnieją w tabeli tymczasowej. Składnia wymieniona przez innego użytkownika:

DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)

Ma potencjalny problem. Zapytanie "wybierz TOP 10" zostanie wykonane dla każdego wiersza w tabeli, co może być ogromnym hitem wydajności. Chcesz uniknąć powtarzania tego samego zapytania w kółko.

Ta składnia powinna działać, w oparciu o to, co wymieniłeś jako swój oryginalna instrukcja SQL:

create table #nuke(NukeID int)

insert into #nuke(Nuke) select top 1000 id from article

delete article where not exists (select 1 from nuke where Nukeid = id)

drop table #nuke
 30
Author: Chris Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 10:06:50

Future reference for those of use who don ' t use MS SQL.

W PostgreSQL użyj ORDER BY i LIMIT zamiast TOP.

DELETE FROM table
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);

MySQL ... ..

Error -- Ta wersja MySQL nie obsługuje jeszcze ' LIMIT & IN / ALL/ANY / SOME subquery "

Chyba jeszcze nie.
 8
Author: Simurr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 10:09:09

Myślę, że korzystanie z wirtualnej tabeli byłoby znacznie lepsze niż w klauzuli lub tabeli tymczasowej.

DELETE 
    Product
FROM
    Product
    LEFT OUTER JOIN
    (
        SELECT TOP 10
            Product.id
        FROM
            Product
    ) TopProducts ON Product.id = TopProducts.id
WHERE
    TopProducts.id IS NULL
 4
Author: Tim Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-05 05:18:43

Nie wiem jak inne smaki ale MySQL DELETE pozwala na ograniczenie.

Jeśli możesz zamówić rzeczy tak, aby n wierszy, które chcesz zachować, znajdowało się na dole, możesz wykonać DELETE FROM table LIMIT tablecount-N.

Edit

Oooo. Myślę, że bardziej podoba mi się odpowiedź Cory ' ego Foya, zakładając, że działa w Twoim przypadku. Moja droga wydaje się trochę niezgrabna w porównaniu.

 2
Author: Mark Biek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:53

To naprawdę będzie specyficzne dla języka, ale prawdopodobnie użyłbym czegoś takiego jak poniżej dla SQL server.

declare @n int
SET @n = SELECT Count(*) FROM dTABLE;
DELETE TOP (@n - 10 ) FROM dTable

Jeśli nie zależy ci na dokładnej liczbie wierszy, zawsze jest

DELETE TOP 90 PERCENT FROM dTABLE;
 1
Author: Noah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-03 22:15:44

Rozwiązałbym to używając poniższej techniki. Przykład oczekuje ArtykułTabela z id w każdym wierszu.

Delete article where id not in (select top 1000 id from article)

Edit: zbyt wolno odpowiedzieć na własne pytanie ...

 0
Author: Riri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 17:49:10

Refakturowany?

Delete a From Table a Inner Join (
    Select Top (Select Count(tableID) From Table) - 10) 
        From Table Order By tableID Desc
) b On b.tableID = A.tableID

edit: próbowałem ich obu w analizatorze zapytań, bieżąca odpowiedź jest poszczona (cholerna kolejność przez...)

 0
Author: Shawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 18:35:35

Lepszym sposobem byłoby wstawienie wierszy, które chcesz wstawić do innej tabeli, upuść oryginalną tabelę, a następnie zmień nazwę nowej tabeli, aby miała taką samą nazwę jak stara tabela

 0
Author: SQLMenace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 18:37:40