Как мне ограничить количество строк в DELETE с DB2? - PullRequest
10 голосов
/ 30 июня 2009

Я хочу добавить защиту для чувствительной таблицы, когда удаляю строки с запросом SQL в таблице DB2.

Я хочу имитировать способ, которым MySQL позволяет ограничивать количество строк, удаляемых в запросе SQL.

В основном я хочу сделать это с DB2:

DELETE FROM table WHERE info = '1' LIMIT 1

Есть ли способ сделать это с DB2?

Ответы [ 9 ]

9 голосов
/ 30 июня 2009
delete from table where id in (select id from table where info = '1' order by id fetch first 1 rows only)
6 голосов
/ 14 августа 2015

Это действительно зависит от вашей платформы.

Если вы используете DB2 в Linux / Unix / Windows, вы можете просто создать выборку, которая получит нужные вам строки, и поместить ее в качестве подзапроса для удаления, и DB2 сможет удалить результаты вашего Выбрать. Вот так:

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

Если вы используете DB2 для 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;
1 голос
/ 20 февраля 2015

Если ваш первичный ключ имеет несколько значений или вам просто нужно несколько значений в качестве условия, этот запрос работает:

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 голос
/ 15 мая 2014

В 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 голосов
/ 28 апреля 2015
DELETE                                      
FROM Bibl/File                             
WHERE RRN(File) =  (                        
                    SELECT min(RRN(File))   
                    FROM Bibl/File         
                    WHERE Fld1 = 'xx'     
                   )   

Функция RRN предназначена только для AS400 / iSeries / PowerSystem. В других средах существуют другие функции для относительного номера записи.

Это позволяет стереть запись из нескольких одинаковых даже без УНИКАЛЬНОГО ключа. Его также можно использовать для обновления с небольшими изменениями.

работает как LIMIT, но с DELETE и / или UPDATE.

Работает только на SQL DB2, другие параметры должны быть изменены функцией RRN для возврата номера столбца

0 голосов
/ 12 декабря 2014

Просто выберите оператор и поместите оператор в запрос на удаление:

delete from (
select from table WHERE info = '1' order by id fetch first 25000 rows only
)
0 голосов
/ 09 октября 2014
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;
0 голосов
/ 07 апреля 2014

Как выглядит этот запрос?

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 )
0 голосов
/ 08 октября 2010
DELETE FROM table
WHERE info = '1'
FETCH FIRST 1 ROWS ONLY
...