2009-06-30 17 views
5

Chcę dodać zabezpieczenia do wrażliwej tabeli podczas usuwania wierszy z żądaniem SQL w tabeli DB2.Jak OGRANICZYĆ liczbę wierszy w opcji USUŃ w programie DB2?

Chcę naśladować sposób, w jaki MySQL pozwala ograniczyć liczbę wierszy usuniętych w żądaniu SQL.

Zasadniczo chcę to zrobić z DB2:

DELETE FROM table WHERE info = '1' LIMIT 1 

Czy istnieje sposób, aby zrobić z DB2?

Odpowiedz

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

Dzięki, ale mam dziwny schemat, w którym nie mam jednego identyfikatora dla linii. Identyfikuję linie z kluczem podstawowym złożonym z 2 kolumn. – kevin

+0

co w zamian za pomocą metody row_number()? tj. gdzie nr_wiersza() w (wybierz numer_wiersza (... – Konstantinos

+0

Konstantinos, powinno być "pobieranie tylko pierwszych 1 wierszy". Użyte słowo powinno być wiersze, a nie wiersze, nawet jeśli pobierasz jeden wiersz :) –

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

Niestety to nie działa dla mnie. – kevin

0

Jak to zapytanie?

0

Na 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

Jeśli używasz db2 i na platformie IBMi nie możesz po prostu użyć DFU, aby dostać się do jednego rekordu? –

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

Wystarczy wybrać oświadczenie i umieścić oświadczenie wewnątrz zapytania Usuń:

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

Jeśli podstawowy klucz ma wiele wartości, lub potrzebujesz tylko wielu wartości jako warunku, to jest zapytanie, które działa:

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'  
        ) 

Funkcja RRN dotyczy tylko systemu AS400/iSeries/PowerSystem. W innych środowiskach istnieją inne funkcje dla względnego numeru rekordu.

Umożliwia to usunięcie rekordu kilku identycznych, nawet bez klucza UNIQUE. Można go również użyć do aktualizacji przy niewielkich zmianach.

działa podobnie jak LIMIT, ale z DELETE i/lub UPDATE.

To działa tylko na SQL DB2 w innych ustawieniach powinny być zmieniane przez funkcję RRN powrót numer kolumny

+1

Stackoverflow rozumie tylko angielski! –

+0

Paresh: POLSKI: Wprowadziłem dwujęzyczne, aby dotrzeć do jak największej liczby osób. Myślę, że ważny jest nie język i kolor skóry, ale komunikat, który pomaga rozwiązać problemy. ESPAÑOL: Lo on puesto bilingüe para queue llegue al mayor numero de personas. Creo que lo importante nie ma żadnego idioma o el kolor de piel sino el mensaje que ayuda a resolver los problemas –

0

To naprawdę zależy od platformy.

Jeśli używasz DB2 w systemie Linux/Unix/Windows, możesz po prostu utworzyć selektor, który dostanie żądane wiersze, i wstawić to jako podzapytanie dla usunięcia, a DB2 będzie mogło usunąć wyniki twój wybierz. Tak:

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

Jeśli w programie DB2 for z/OS, że składnia nie działa, niestety. Ale można użyć kluczy podstawowych zrobić w zasadzie to samo (ten działa również na LUW):

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

Oto przykładowy skrypt, który pokazuje, jak to działa:

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; 
Powiązane problemy