10

DB2 テーブルで SQL 要求を使用して行を削除するときに、重要なテーブルにセキュリティを追加したいと考えています。

MySQL で SQL リクエストで削除される行数を制限できるようにする方法を模倣したいと考えています。

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

DELETE FROM table WHERE info = '1' LIMIT 1

DB2 でそれを行う方法はありますか?

4

9 に答える 9

10
delete from table where id in (select id from table where info = '1' order by id fetch first 1 rows only)
于 2009-06-30T10:47:46.867 に答える
6

それは本当にあなたのプラットフォームに依存します。

Linux/Unix/Windows で DB2 を使用している場合は、必要な行を取得する選択を作成し、それを削除のサブクエリとして配置するだけで、DB2 は選択の結果を削除できます。そのようです:

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

DB2 for z/OS を使用している場合、残念ながらその構文は機能しません。ただし、主キーを使用して基本的に同じことを行うことができます (これは 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;
于 2015-08-14T13:34:22.730 に答える
1

IBMi DB2 の場合:

DELETE FROM table WHERE RRN(table) in 
(SELECT RRN(table) FROM table WHERE col1 = '1' AND col2 = '2' FETCH FIRST 5 ROWS ONLY)
于 2014-05-15T16:29:09.263 に答える
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)
于 2015-02-19T21:13:41.490 に答える
0

このクエリはどうですか?

delete from table D where exists 
 ( select * from ( select * from table M fetch first 10 rows only ) as M
   where M.object_id = D.object_id )
于 2014-04-07T14:12:48.330 に答える
-1

ステートメントを選択して、ステートメントを削除クエリ内に配置するだけです。

delete from (
select from table WHERE info = '1' order by id fetch first 25000 rows only
)
于 2014-12-12T03:46:57.683 に答える
-3
DELETE FROM table
WHERE info = '1'
FETCH FIRST 1 ROWS ONLY
于 2010-10-07T22:31:41.577 に答える