2009-06-30 10 views
5

Desidero aggiungere una protezione su una tabella sensibile quando elimino le righe con una richiesta SQL su una tabella DB2.Come si LIMITE il numero di righe in un CANC con DB2?

Desidero simulare il modo in cui MySQL consente di limitare il numero di righe eliminate in una richiesta SQL.

Fondamentalmente io voglio fare questo con DB2:

DELETE FROM table WHERE info = '1' LIMIT 1 

C'è un modo per farlo con DB2?

risposta

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

Grazie, ma ho uno schema strano in cui non ho un singolo identificatore per una linea. Identifico le linee con una chiave primaria composta da 2 colonne. – kevin

+0

invece di usare row_number()? cioè dove row_number() in (selezionare row_number (... – Konstantinos

+0

Konstantinos, dovrebbe essere 'recuperare solo le prime 1 righe'. La parola usata dovrebbe essere riga e non riga anche se stai recuperando una singola riga :) –

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

Purtroppo questo non funziona per me. – kevin

0

Come è questa ricerca?

0

Su 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

Se sei su db2 e su un IBMi, non puoi semplicemente usare DFU per ottenere un record? –

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

basta selezionare una dichiarazione, e mettere la dichiarazione all'interno della query di eliminazione:

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

Se la chiave primaria ha più valori, o hai solo bisogno di più valori come condizione, questa è la query che funziona:

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

La funzione RRN è AS400/iSeries/solo PowerSystem. In altri ambienti ci sono altre funzioni per il relativo numero di record.

Ciò consente di cancellare un record di più identici anche senza chiave UNIQUE. Può anche essere utilizzato per aggiornare con modifiche minori.

funziona come LIMIT ma con DELETE e/o UPDATE.

Funziona solo su SQL DB2 in altri contesti dovrebbe essere cambiata in base alla funzione RRN per restituire il numero di colonna

+1

Stackoverflow capisce solo l'inglese! –

+0

Paresh: ITALIANO: ho messo bilingue per raggiungere il maggior numero di persone. Penso che l'importante non sia la lingua o il colore della pelle, ma il messaggio che aiuta a risolvere i problemi. ESPAÑOL: Lo fa puesto bilingue para que llegue al mayor numero de personas. Creo que lo importante no es el idioma o il colore di piel fino al mese prima di un risolveredi problemasmas –

0

E 'davvero dipende dalla vostra piattaforma.

Se si utilizza DB2 su Linux/Unix/Windows, è sufficiente creare una selezione che ottiene le righe desiderate e inserirla come subquery per l'eliminazione e DB2 sarà in grado di eliminare i risultati di la tua selezione. Mi piace così:

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

Se sei su DB2 per z/OS, quella sintassi non funziona, sfortunatamente. Ma, è possibile utilizzare le chiavi primarie di fare fondamentalmente la stessa cosa (questo funziona anche su LUW):

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

Ecco uno script di esempio che dimostra come viene utilizzato:

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; 
Problemi correlati