How do I LIMIT the number of rows in a DELETE with DB2?

后端 未结 9 549
醉梦人生
醉梦人生 2021-01-11 17:09

I want to add a security on a sensitive table when I delete lines with an SQL request on a DB2 table.

I want to mimic the way MySQL allows you to limit the numbers o

相关标签:
9条回答
  • 2021-01-11 18:11

    It really depends on your platform.

    If you're using DB2 on Linux/Unix/Windows, you can just create a select that gets the rows you want, and put that as a subquery for your delete, and DB2 will be able to delete the results of your select. Like so:

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

    If you're on DB2 for z/OS, that syntax doesn't work, unfortunately. But, you can use your primary keys to do basically the same thing (this one also works on LUW):

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

    Here is an example script that demonstrates how it's used:

    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;
    
    0 讨论(0)
  • 2021-01-11 18:11

    On 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)
    
    0 讨论(0)
  • 2021-01-11 18:15
    DELETE FROM table
    WHERE info = '1'
    FETCH FIRST 1 ROWS ONLY
    
    0 讨论(0)
提交回复
热议问题