SQLのテーブルからすべての行を削除し、n個の行を一番上に保持するための最良の方法は何ですか?
回答:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
編集:
トップ10クエリが各行に対して実行されるため、Chrisはパフォーマンスに大きな影響を与えます。これが1回限りのことであれば、それほど大きな問題ではないかもしれませんが、一般的なことであれば、私はそれを詳しく調べました。
DELETE FROM Table WHERE ID NOT IN (SELECT id FROM (SELECT TOP 10 ID FROM Table) AS x)MySQLに一時テーブルを作成させるようにクエリを作成することで、サブクエリのパフォーマンスの問題を解決できることに注意してください。
一時テーブルまたはテーブル変数に保持する行のセットのID列を選択します。次に、一時テーブルに存在しないすべての行を削除します。別のユーザーが言及した構文:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
潜在的な問題があります。「SELECTTOP10」クエリは、テーブルの各行に対して実行されます。これは、パフォーマンスに大きな打撃を与える可能性があります。同じクエリを何度も繰り返さないようにします。
この構文は、元の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
insert into #nuke(Nuke) ...おそらく次のようになります。insert into #nuke(NukeID) ...あなたはこれらの行を削除しないようにしようとしているので、また名前の核兵器が混乱しています。核兵器はおそらく削除されるという事実にちなんで名付けられています。
他のフレーバーについてはわかりませんが、MySQLDELETEではLIMITが許可されています。
保持したいn行が一番下になるように並べ替えることができる場合は、DELETE FROM table LIMITtablecount-nを実行できます。
編集
うーん。あなたの場合にうまくいくとすれば、私はCoryFoyの答えの方が好きだと思います。比較すると、私のやり方は少し不格好です。
これは実際には言語固有になりますが、SQLサーバーには次のようなものを使用する可能性があります。
declare @n int
SET @n = SELECT Count(*) FROM dTABLE;
DELETE TOP (@n - 10 ) FROM dTable
行の正確な数を気にしない場合は、常にあります
DELETE TOP 90 PERCENT FROM dTABLE;
これが私がそれをした方法です。この方法はより速く、より簡単です。
OFFSETコマンドを使用して、MSSQLのデータベーステーブルから上位nを除くすべてを削除します
WITH CTE AS
(
SELECT ID
FROM dbo.TableName
ORDER BY ID DESC
OFFSET 11 ROWS
)
DELETE CTE;
ID並べ替える列に置き換えます。後のOFFSET番号を、削除する行の数に置き換えます。DESCまたはASC-あなたのケースに合ったものを選択してください。
より良い方法は、必要な行を別のテーブルに挿入し、元のテーブルを削除してから、新しいテーブルの名前を変更して、古いテーブルと同じ名前にすることです。
TOPすべての行に対して式を実行しないようにするためのトリックがあります。と組み合わせTOPて、維持したいものをMAX取得できMaxIdます。次に、より大きいものをすべて削除しますMaxId。
-- Declare Variable to hold the highest id we want to keep.
DECLARE @MaxId as int = (
SELECT MAX(temp.ID)
FROM (SELECT TOP 10 ID FROM table ORDER BY ID ASC) temp
)
-- Delete anything greater than MaxId. If MaxId is null, there is nothing to delete.
IF @MaxId IS NOT NULL
DELETE FROM table WHERE ID > @MaxId
注:適切な結果が照会されるようORDER BYに宣言するときに使用することが重要MaxIdです。