1. ホーム
  2. データベース
  3. エムエスエル

sql serverで最初の1000行のデータを削除する方法の例

2022-01-07 16:57:46

最近、sqlデータベース入門学習会の友人から「sqlを使ってテーブルから最初の1000行のデータを削除する方法が知りたいのですが、可能でしょうか?

オラクルのデータベース管理ソフトであれば、比較的簡単に導入できます

delete from table name where rownum<=1000;


データベース管理ソフトのsql serverはどうでしょうか?

sql serverにはrownum関数がないので、select topを使おうとしています。

最初のクエリは、結果セットを見るために、テーブル名から*を選択します。

delete from table name 
where barcode 
in (select top 10 barcodes from table name)


--注意事項 データ量に限りがあるため、最初の10行を削除するテストを実施

このように処理すると、何かが間違ってしまうのですが、なぜでしょうか?もし条件が , ならば、最初の10行の中のバーコード範囲しか削除できないので、そのバーコードのテーブルのすべてのレコードを誤って削除することになり、この方法はうまくいきません。

では、row_number()関数を使って、Oracleやsql serverのようにソートできるのでしょうか?

row_number()関数は、SELECT文が返す各行に1から順に番号を付け、連続した番号を与えます。

オーバーで使用する必要があります。

構文は以下の通りです。

<ブロッククオート

select *,ROW_NUMBER() over(order by productid) as num from product_test;

その文は以下の通りです。

select ROW_NUMBER() over (order by date) as num ,* from table name



出力は次のようになります。

上記のように、シリアル番号でソートされているので、最初の10行のデータを削除するのは簡単です。

delete from
 (select ROW_NUMBER() over
 (order by date) as num ,* from table name) tt 
where tt.num<=10



結果は残念なもので、delete from はサブクエリを直接ネストすることができません。

(皆さん、ネストで処理する方法をご存知の方は、公開ハガキに返信してください)

最後に、これを処理するビューを作ることを考え、まず以下の文でソートされた状態のビューを作成しました。

create view view name1 
as
select ROW_NUMBER() over (order by date) as num ,* from table name
go


ビューに問い合わせ、以下のように結果セットを出力します。

以下のステートメントで、ビューを通じて最初の10行のデータを削除します。

delete from view name 1 where num <=10;



条件を1000以下にして、テーブルの最初の1000行を削除する

概要を説明します。

1.オラクルのrownumはデータレコードのソートに挿入されますが、SQLサーバーは列でソートされ、それは間違ってデータを削除しないように、使用前に作成時間または発生時間でソートすることができるかどうかを確認することが推奨されます。

2は、テーブルのデータメソッドの最初の10行を削除することにより、ビューの理解を深めるために、ビューの変更は、直接ベーステーブルのデータに影響を与えます。

3、問題に対処するとき、それは結果を得るために文である必要はありません、あなたはビューまたは一時テーブルを作成することによって対処することができます、それはより良い動作するかもしれない、クエリのパフォーマンスに影響を与える可能性はありません。

まとめる

この記事は、SQL Serverは、データの最初の1000行を削除することについて、ここに導入され、より関連するsqlserverは、データの内容の最初の1000行を削除するスクリプト家の前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは将来的に多くのスクリプト家をサポートします願っています!.