2009-06-30 33 views
5

DB2テーブルのSQL要求を含む行を削除すると、機密テーブルにセキュリティを追加したいと考えています。DB2でDELETEの行数をどのように制限しますか?

SQLリクエストで削除された行の数を制限する方法を模倣したいと思います。

基本的に私は、DB2でこれをしたい:

DELETE FROM table WHERE info = '1' LIMIT 1 

DB2とそれを行うための方法はありますか?このクエリがどのように

答えて

7
delete from table where id in (select id from table where info = '1' order by id fetch first 1 rows only) 
+0

ありがとうございますが、私は奇妙なスキーマを持っています。このスキーマでは、行の識別子は1つもありません。 私は、2つの列で構成される主キーを持つ行を識別します。 – kevin

+0

代わりにrow_number()を使用するのはどうですか?つまり、row_number()内のselect row_number(... – Konstantinos

+0

コンスタンティノス、 '最初に1行だけを取り出す'べきです。使用するWordは、行ではなく行ではなく、行でなければなりません。 –

-3
DELETE FROM table 
WHERE info = '1' 
FETCH FIRST 1 ROWS ONLY 
+0

残念ながら、これは私のためには機能しません。 – kevin

0

IBMI DB2で
0

DELETE FROM table WHERE RRN(table) in 
(SELECT RRN(table) FROM table WHERE col1 = '1' AND col2 = '2' FETCH FIRST 5 ROWS ONLY) 
+0

あなたがDB2上で、IBMi上でDFUを使用して1つのレコードにアクセスできない場合は、 –

0
MERGE INTO XYZ A<BR> 
USING (<BR> 
SELECT RID_BIT(B) CHAVE<BR> 
FROM XYZ B<BR> 
FETCH FIRST 100000 ROWS ONLY) B<BR> 
ON RID_BIT(A) = B.CHAVE<BR> 
WHEN MATCHED THEN DELETE; 
-1

だけの文を選択して、削除クエリ内のステートメントを置く:

delete from (
select from table WHERE info = '1' order by id fetch first 25000 rows only 
) 
1

あなたの主キーに複数の値がある場合、条件として複数の値が必要な場合は、これが動作するクエリです。

DELETE FROM TABLE 
WHERE (COLUMN1, COLUMN2) IN (
    SELECT COLUMN1, COLUMN2 FROM TABLE 
    WHERE SOME_COLUMN='THIS' 
    AND SOME_OTHER_COLUMN LIKE 'THAT%' 
    FETCH FIRST 10 ROWS ONLY) 
-1
DELETE          
FROM Bibl/File        
WHERE RRN(File) = (      
        SELECT min(RRN(File)) 
        FROM Bibl/File   
        WHERE Fld1 = 'xx'  
        ) 

RRN機能は、AS400/iSeries/PowerSystemだけです。他の環境では、相対レコード番号のための他の機能があります。

これにより、UNIQUEキーがなくてもいくつかのレコードを消去することができます。また、マイナーな変更で更新することもできます。

は、LIMITのように機能しますが、DELETEやUPDATEと同様に機能します。

それが唯一の他の設定でSQL DB2上で動作は、それが本当にあなたのプラットフォームに依存列番号

+1

Stackoverflowは英語のみを理解しています! –

+0

Paresh:ENGLISH:私は最大の人数に達するためにバイリンガルを付けました。私は重要なのは言語や肌の色ではなく、問題を解決するのに役立つメッセージだと思います。エスパニョール:彼はあなたの市長に相応しい人です。あなたの意見を聞かせてください –

0

を返すためにRRN機能によって変更する必要があります。

Linux/Unix/WindowsでDB2を使用している場合は、必要な行を取得するselectを作成し、それを削除用のサブクエリとして配置すれば、DB2は次の結果を削除できます。あなたの選択。同様に:

DELETE FROM (
    SELECT 1 
    FROM table 
    WHERE info = '1' 
    ORDER BY your_key_columns 
    FETCH FIRST ROW ONLY 
) AS A 
; 

z/OSのDB2を使用している場合、その構文はうまくいきません。しかし、あなたは基本的に同じことを行うには、あなたの主キーを使用することができます(これはまた、LUW上で動作します):

DELETE FROM table 
WHERE (info, key2) IN (
    SELECT info, key2 
    FROM table 
    WHERE info = 1 
    ORDER BY key2 
    FETCH FIRST ROW ONLY 
); 
ここ

は、それが使われている方法を示すサンプルスクリプトです:

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEST(
    ID INT 
    ,RN INT 
) ON COMMIT PRESERVE ROWS; 

INSERT INTO SESSION.TEST 
    SELECT 1,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 1,2 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 1,3 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 1,4 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 1,5 FROM SYSIBM.SYSDUMMY1 UNION ALL 

    SELECT 2,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 2,2 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 2,3 FROM SYSIBM.SYSDUMMY1 UNION ALL 

    SELECT 3,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 3,2 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 3,3 FROM SYSIBM.SYSDUMMY1 UNION ALL 

    SELECT 4,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 4,2 FROM SYSIBM.SYSDUMMY1 UNION ALL 

    SELECT 5,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 6,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 7,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 8,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 9,1 FROM SYSIBM.SYSDUMMY1 UNION ALL 
    SELECT 10,1 FROM SYSIBM.SYSDUMMY1 
; 

SELECT * FROM SESSION.TEST ORDER BY ID, RN; 

-- LUW Version 
DELETE FROM (
    SELECT 1 
    FROM SESSION.TEST 
    WHERE ID = 1 
    ORDER BY RN 
    FETCH FIRST ROW ONLY 
) AS A 
; 

--Mainframe version 
DELETE FROM SESSION.TEST 
WHERE (ID, RN) IN (
    SELECT ID, RN 
    FROM SESSION.TEST 
    WHERE ID = 1 
    ORDER BY RN 
    FETCH FIRST ROW ONLY 
); 

SELECT * FROM SESSION.TEST ORDER BY ID, RN; 

DROP TABLE SESSION.TEST; 
関連する問題