Come faccio a LIMITARE il numero di righe in un ELIMINARE con DB2?

Voglio aggiungere una protezione su un tavolo sensibile quando ho eliminazione delle righe con una richiesta SQL su una tabella DB2.

Voglio imitare il modo di MySQL permette 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 ?

OriginaleL’autore kevin | 2009-06-30

9 Replies
  1. 9
    delete from table where id in (select id from table where info = '1' order by id fetch first 1 rows only)
    Grazie, ma ho una strana schema in cui non ho un identificatore unico per una linea. Ho identificare linee con una chiave primaria composta da 2 colonne.
    che cosa circa usando la funzione row_number() invece? cioè dove row_number() in ( select row_number( …
    Konstantinos, dovrebbe essere ‘fetch first 1 solo righe’. Parola usata dovrebbe essere righe e non riga, anche se il recupero di una singola riga 🙂
    thx per la correzione, la modifica 🙂

    OriginaleL’autore Konstantinos

  2. 4

    Davvero dipende dalla vostra piattaforma.

    Se si utilizza DB2 su Linux/Unix/Windows, è possibile creare una select che ottiene le righe che si desidera e mettere che come una sottoquery per la cancellazione, e DB2 sarà in grado di eliminare i risultati della selezione. In questo modo:

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

    Se siete su DB2 per z/OS, che la sintassi non funziona, purtroppo. Ma, è possibile utilizzare il vostro primario tasti per fare praticamente 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 illustra 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;

    OriginaleL’autore bhamby

  3. 1

    Se la chiave primaria è più valori, o semplicemente hai 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)

    OriginaleL’autore bluefoot

  4. 0

    Come è questa query?

    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 )

    OriginaleL’autore klaus momberger

  5. 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)
    Se siete su db2 e su un IBMi non si può semplicemente utilizzare DFU a registrare?

    OriginaleL’autore keV

  6. 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;

    OriginaleL’autore minervino

  7. -1

    Basta selezionare una dichiarazione, e inserire l’istruzione all’interno di una query di eliminazione:

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

    OriginaleL’autore Panadol Chong

  8. -1
    DELETE                                      
    FROM Bibl/File                             
    WHERE RRN(File) =  (                        
                        SELECT min(RRN(File))   
                        FROM Bibl/File         
                        WHERE Fld1 = 'xx'     
                       )   

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

    Questo rende possibile cancellare un record di più identici anche senza chiave UNIVOCA. Può anche essere utilizzato per aggiornare con lievi modifiche.

    funziona come LIMITE, ma con ELIMINARE e /o di AGGIORNAMENTO.

    Funziona solo su SQL DB2 in altre impostazioni devono essere modificate dalla RRN funzione restituisce il numero di colonna

    Stackoverflow capisce solo in inglese!
    Paresh: INGLESE: ho messo bilingue per raggiungere il maggior numero di persone. Io penso che la cosa importante non è la lingua o il colore della pelle, ma il messaggio che aiuta a risolvere i problemi. ESPAÑOL: Lo ha puesto bilingüe para que llegue al sindaco numero de personas. Creo que lo importante no es el idioma o el color de la piel sino el mensaje que ayuda un sistema di risoluzione los problemas

    OriginaleL’autore Juan Acisa

  9. -3
    DELETE FROM table
    WHERE info = '1'
    FETCH FIRST 1 ROWS ONLY
    Purtroppo questo non funziona per me.

    OriginaleL’autore elcool

Lascia un commento