レコード登録時にテーブルの件数が規定数を越えているならば、指定件数分の既存レコードを削除したいのですが、方法が見つかりません。
目的のテーブルは以下のような構造になっております。
P-Key1:大枠のID(プライマリキー1)
P-Key2:大枠内の序列を表す(プライマリキー2)
THRED:登録元スレッド番号(プライマリキー3)
FILE:ファイルパスを格納
TIMESTAMP:登録日付、DATE型
TERMID:端末ID(プライマリキー4)
この内、削除時に指定するのはスレッド番号と端末IDだけです。
残りのプライマリキーが一つならば、IN句の副問い合わせでできそうな感じですが、2つある為、IN句では指定できませんでした。
以下は、試したSQL文です。ただし、全部失敗しております。
DELETE FROM (select * FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP) WHERE ROWNUM < 3;
DELETE FROM テーブル WHERE P-Key1 IN (SELECT P-Key1 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' AND ROWNUM < 3 ORDER BY TIMESTAMP) AND P-Key2 IN (SELECT P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' AND ROWNUM < 3 ORDER BY TIMESTAMP);
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>残りのプライマリキーが一つならば、IN句の副問い合わせでできそうな感じですが、
>2つある為、IN句では指定できませんでした。
こんな感じで、2項目以上のIN条件(メンバーシップ検査)は可能です。
サンプルがROWNUMを使っているので、同じようにROWNUMを使った場合です。
DELETE FROM テーブル
WHERE
(P-Key1,P-Key2)
IN
(
SELECT P-Key1,P-Key2
FROM
(
SELECT P-Key1,P-Key2,ROWNUM R
FROM
(
SELECT P-Key1,P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP
)
)
WHERE R<3
)
;
ROWNUMをROW_NUMBER分析関数に書き換えると、サブクエリが少し単純化されます。
DELETE FROM テーブル
WHERE
(P-Key1,P-Key2)
IN
(
SELECT P-Key1,P-Key2
FROM
(
SELECT P-Key1,P-Key2,ROW_NUMBER() OVER(PARTITION BY P-Key1,P-Key2 ORDER BY TIMESTAMP) R
FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID'
)
WHERE R<3
)
;
ご回答を下さりまして、ありがとうございます。
ROWNUMを使ったSQL文の方で、期待の結果が得られました。
ただ、ROWNUMBER()関数を使った方では、予めSELECT文で試したところ、2件ではなく該当する全件数が出力されましたので、簡単ながら、この事も報告に添えます。
ありがとうございました。
蛇足ながら、以下に検証の為に使用したSQL文を添えます。
SELECT TO_CHAR(TIMESTAMP,'RR-MM-DD HH24:MI:SS') FROM テーブル WHERE (P-Key1,P-Key2) IN ( SELECT P-Key1,P-Key2 FROM ( SELECT P-Key1,P-Key,ROWNUM R FROM ( SELECT P-Key1,P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP ) ) WHERE R<3 );
DELETE FROM テーブル WHERE (P-Key1,P-Key) IN ( SELECT P-Key1,P-Key2 FROM ( SELECT P-Key1,P-Key2,ROWNUM R FROM ( SELECT P-Key1,P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP ) ) WHERE R<3 );
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sqlplusで表示が変なので、出力...
-
テーブル名をカラムとして取得...
-
SQL*LoaderでCSVから指定した列...
-
ROWNUMでUPDATEをしたいのです...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
SQLでSUMなどの関数でデータが...
-
件数とデータを同時に取得する...
-
Oracle(オラクル)で、日付時刻...
-
DBからタブ区切りのCSVデータを...
-
ワークテーブルって何?
-
LONG型の先頭250バイトを Varch...
-
SQLで複数列のデータを複数行に...
-
DELETE文のWHERE条件にSUBSTRを...
-
半角英数文字の抽出がしたい。
-
PLSQLでフィールド名の参照につ...
-
OracleのSQLで同テーブルのカラ...
-
カラム情報(主キー、データ型、...
-
日付の古い順番に削除したいの...
-
distinct をexistsに変換する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
ROWNUMでUPDATEをしたいのです...
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
sqlplusで表示が変なので、出力...
-
カラム位置変更
-
件数とデータを同時に取得する...
-
SQL 複数テーブルのupdate
-
特定のカラムが更新されたとき...
-
OracleのSQLで同テーブルのカラ...
-
数値をNUMBER型にするかCHAR型...
-
UPDATE文
-
LONG型の先頭250バイトを Varch...
-
SQLで違うテーブルの値を比較し...
-
DELETE文とロックについて
-
PLSQLのNumber型の初期化
-
SQL(oracle)でご助言いただきた...
-
半角英数文字の抽出がしたい。
おすすめ情報