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?
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.
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
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 ... ..
Chyba jeszcze nie.Error -- Ta wersja MySQL nie obsługuje jeszcze ' LIMIT & IN / ALL/ANY / SOME subquery "
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
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.
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;
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 ...
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...)
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
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