2009-06-30 56 views
5

Quiero agregar una seguridad en una tabla sensible cuando elimino líneas con una solicitud de SQL en una tabla de DB2.¿Cómo LIMITO el número de filas en un DELETE con DB2?

Quiero imitar la forma en que MySQL le permite limitar el número de filas eliminadas en una solicitud SQL.

Básicamente quiero hacer esto con DB2:

DELETE FROM table WHERE info = '1' LIMIT 1 

¿Hay una manera de hacerlo con DB2?

Respuesta

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

Gracias pero tengo un esquema extraño en el que no tengo un identificador único para una línea. Identifico líneas con una clave principal compuesta de 2 columnas. – kevin

+0

¿qué hay de usar row_number() en su lugar? es decir, donde row_number() in (seleccione row_number (... – Konstantinos

+0

Konstantinos, debería ser 'buscar las primeras 1 filas solamente'. La palabra utilizada debe ser filas y no una fila, incluso si está buscando una sola fila :) –

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

Lamentablemente, esto no funciona para mí. – kevin

0

¿Cómo es esta consulta?

0

En 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

Si está en db2 y en un IBMi, ¿no puede usar DFU para acceder al único registro? –

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

Sólo elige la declaración, y poner la declaración dentro de la consulta de eliminación:

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

Si su clave primaria tiene múltiples valores, o simplemente necesita valores múltiples como condición, esta es la consulta que funciona:

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 función RRN es AS400/iSeries/PowerSystem solo. En otros entornos, existen otras funciones para el número de registro relativo.

Esto hace posible borrar un registro de varios idénticos incluso sin la tecla UNIQUE. También se puede usar para actualizar con cambios menores.

funciona como el LIMIT pero con DELETE y/o UPDATE.

Sólo funciona en DB2 SQL en otros entornos debe ser cambiado por la función RRN para devolver el número de columna

+1

¡Stackoverflow solo entiende inglés! –

+0

Paresh: INGLÉS: He puesto bilingüe para llegar a la mayor cantidad de personas. Creo que lo importante no es el lenguaje o el color de la piel, sino el mensaje que ayuda a resolver los problemas. ESPAÑOL: Lo he puesto bilingüe para que llegue al mayor número de personas. Creo que lo importante no es el idioma o el color de piel sino el mensaje que ayuda a resolver los problemas –

0

Realmente depende de su plataforma.

Si está utilizando DB2 en Linux/Unix/Windows, puede simplemente crear una selección que obtenga las filas que desea, y poner eso como una subconsulta para su eliminación, y DB2 podrá eliminar los resultados de tu selecciono De esta manera:

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

Si está en DB2 para z/OS, esa sintaxis no funciona, desafortunadamente. Sin embargo, puede utilizar sus claves primarias que hacer básicamente lo mismo (éste también trabaja en LUW):

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

Aquí es un script de ejemplo que muestra cómo se usa:

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; 
Cuestiones relacionadas