Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用DB2限制DELETE中的行数?_Sql_Db2_Limit - Fatal编程技术网

Sql 如何使用DB2限制DELETE中的行数?

Sql 如何使用DB2限制DELETE中的行数?,sql,db2,limit,Sql,Db2,Limit,当我删除DB2表上带有SQL请求的行时,我想在敏感表上添加安全性 我想模仿MySQL允许您限制SQL请求中删除的行数的方式 基本上,我想用DB2实现这一点: DELETE FROM table WHERE info = '1' LIMIT 1 有没有办法用DB2做到这一点?这个查询怎么样 delete from table where id in (select id from table where info = '1' order by id fetch first 1 rows only

当我删除DB2表上带有SQL请求的行时,我想在敏感表上添加安全性

我想模仿MySQL允许您限制SQL请求中删除的行数的方式

基本上,我想用DB2实现这一点:

DELETE FROM table WHERE info = '1' LIMIT 1
有没有办法用DB2做到这一点?

这个查询怎么样

delete from table where id in (select id from table where info = '1' order by id fetch first 1 rows only)
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 )
在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)
合并到XYZ A中
使用(
选择RID_位(B)CHAVE
从XYZ B
仅获取前100000行)B
在RID_位(A)=B.CHAVE
匹配后删除;
只需选择一条语句,并将该语句放入删除查询中:

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

如果您的主键有多个值,或者您只需要多个值作为条件,那么这就是有效的查询:

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)
RRN功能仅适用于AS400/iSeries/PowerSystem。在其他环境中,还有其他用于相对记录编号的函数

这样,即使没有唯一的键,也可以擦除几个相同的记录。它还可用于进行小更改的更新

与“限制”类似,但与“删除”和/或“更新”一起使用


它只在SQL DB2上工作,其他设置应由RRN函数更改以返回列号,具体取决于您的平台

如果在Linux/Unix/Windows上使用DB2,只需创建一个select来获取所需的行,并将其作为delete的子查询,DB2就可以删除select的结果。像这样:

DELETE FROM (
    SELECT 1
    FROM table
    WHERE info = '1'
    ORDER BY your_key_columns
    FETCH FIRST ROW ONLY
) AS A
;
不幸的是,如果您使用的是DB2forz/OS,那么这种语法不起作用。但是,您可以使用主键执行基本相同的操作(此主键也适用于LUW):


下面是一个示例脚本,演示如何使用它:

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;

谢谢,但我有一个奇怪的模式,在这个模式中,我没有一个行的标识符。我使用由两列组成的主键标识行。改为使用row_number()如何?ie中的行号()的位置(选择行号(…Konstantinos,它应该是“仅获取前1行”。使用的单词应该是行,而不是行,即使您获取的是单行:)Stackoverflow只懂英语!帕雷什:英语:我已经把双语应用到了最多的人身上。我认为重要的不是语言或肤色,而是帮助解决问题的信息。西班牙人:他是一个有个性的市长。克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·克鲁·如果你在db2和IBMi上,你不能只使用DFU来获取一条记录吗?这对于我的用例来说是非常好的,我有大量的行要删除,我想成批地删除。为什么按你的键列排序?删除ORDER BY并添加UR to不是更好吗让DB根据布局的便利性决定删除哪些行。OP说限制是安全检查(大概是为了阻止它填充回滚日志)
DELETE                                      
FROM Bibl/File                             
WHERE RRN(File) =  (                        
                    SELECT min(RRN(File))   
                    FROM Bibl/File         
                    WHERE Fld1 = 'xx'     
                   )   
DELETE FROM (
    SELECT 1
    FROM table
    WHERE info = '1'
    ORDER BY your_key_columns
    FETCH FIRST ROW ONLY
) AS A
;
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;