Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Limit in DB2

  1. #1

    Limit in DB2

    Problema non facile!
    Ho la necessità di fare una query utilizzando come statement di una select LIMIT.Ho visto, cercando in giro, che a seconda dei DB utilizzati ha sintassi completamente differenti tra di loro.
    EX.
    MYSQL:
    SELECT * FROM TABELLA LIMIT 0,10

    POSGRESQL:
    SELECT * FROM NOTIZIE LIMIT 10 OFFSET 0


    ..non riesco a trovare nulla di simile in DB2 se non l'estrazione di un num di record a partire dall'inizio tipo

    DB2:
    SELECT * FROM tabella fetch first 5 rows only


    estrae le prime 5 righe.
    Forse il forum non è azzecatissimo ma tutto mi parte da pagine PHP
    AIUTO!

    Ciao Giu

  2. #2

    non so più dove sbattere la testa....help me!!!!!!!

  3. #3

  4. #4
    Grazie. ma non c'è ciò che mi interessa. A me serve esplicitamente una LIMIT 0,10 su db2 (su cui non posso neanche risolvere concatendando dei TOP, soluzione workaround che ho già visto). Ho paura che non sia implementato come statement.
    AIUTOOO!!!!!

  5. #5


    a te serve estrarre i primi 10 record....giusto?
    a parte che non ci credo che manchi il limit proprio in DB2...ma a parte questo se ti estrai a mano tu i primi 10 record invece di farlo fare al db? si consuma + memoria ma se non riesci a trovare nessun'aiuto e nessuna soluzione e sempre l'ultimo spuntone dove aggrapparsi ^^

  6. #6
    No, non mi serve estrarre i primi 10 record.Mi interessa estrarre i record per delle paginazioni quindi nella prima pagina saranno i record dall'1 al 10, nella seconda dal 11 al 20 e via dicendo.E' tutto ieri che cerco info e anche sulla manualista IBM non c'è niente che parli di LIMIT.Nessuno di voi si è già imbattuto in queto problema?

  7. #7
    Ciao,
    limit esiste solo in MySQL, PostgreSQL e SQLite (non è sql standard), quasi mai gli altri RDBMS non hanno un equivalente.
    La clausola TOP in SQL Server non fa lo stesso, idem per first in DB2

    Non conosco DB2 ma lavorando con altri database di solito la soluzione è utilizzare una stored procedure che salva i risultati da paginare in una tabella temporanea che presenta un id autoincrementante

    Qui trovi un esempio per SQLserver, puoi adattarlo a DB2

    -- simula limit start, offset
    CREATE PROCEDURE sp_conc_paging (
    @tipo int = NULL,
    @id_regione int,
    @PageIndex int,
    @PageSize int
    )

    AS

    -- ricavo gli estremi inferiore e superiore
    DECLARE @Upper int
    DECLARE @Lower int
    SET @Lower = @PageSize * @PageIndex
    SET @Upper = @Lower + @PageSize +1

    -- tabella temporanea
    CREATE TABLE #Pageit
    (
    RowID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    OriginalID nvarchar(5) COLLATE DATABASE_DEFAULT,
    )


    -- inserisco la chiave della tabella in quella di appoggio

    -- tutti
    IF @tipo <> 1 AND @tipo <> 0

    BEGIN
    INSERT INTO #Pageit(OriginalID)

    SELECT ltrim(codiceAG) FROM servicep_conc_view
    WHERE id_regione=@id_regione ORDER BY ltrim(prov_full), ltrim(ragsoc)

    END
    ELSE
    BEGIN
    -- solo service partner o solo concessionari
    INSERT INTO #Pageit(OriginalID)

    SELECT ltrim(codiceAG) FROM servicep_conc_view
    WHERE id_regione=@id_regione AND tipo=@tipo ORDER BY ltrim(prov_full), ltrim(ragsoc)

    END

    -- estraggo i dati dalle due tabelle
    -- è indispensabile estrarre il RowID dalla tab temporanea per avere i dati ordinati
    --
    SELECT v.* FROM #Pageit p
    JOIN servicep_conc_view v ON
    p.OriginalID = v.codiceAG AND
    p.RowID > @Lower AND p.RowID < @Upper ORDER BY p.RowID
    GO


    la stored procedure non è indispensabile, infatti l'unica cosa indipsensabile sono la tabella temporanea e questa query

    SELECT v.* FROM #Pageit p
    JOIN servicep_conc_view v ON
    p.OriginalID = v.codiceAG AND
    p.RowID > @Lower AND p.RowID < @Upper ORDER BY p.RowID


    Ma le prestazioni di una stored procedure sono di gran lunga migliori
    per favore NIENTE PVT TECNICI da sconosciuti

  8. #8
    Proverò appena possibile. Per adesso ti ringrazio e ti faccio sicuramente saper se sono riuscito a farlo funzionare.

  9. #9
    Mi sono imbattuto nello stesso problema e ho risolto così:

    MYSQL:
    Codice PHP:
    SELECT FROM TABELLA LIMIT 0,10 
    DB2:
    Codice PHP:
    SELECT TEMP.* FROM (
        
    SELECT ROW_NUMBER() OVER () AS NUMTEMPTABELLA.* FROM TABELLA
    ) AS TEMP WHERE NUMTEMP BETWEEN 0 AND 10 
    Praticamente è la stessa soluzione del mitico Fabio, ma visto che DB2 permette le query innestate, è più semplice da usare...

    Ciao!!!
    Salvatore De Bonis AKA Novice of Ricotta AKA NashCrash

  10. #10
    OPS... era un post vecchissimo... scusate!
    Salvatore De Bonis AKA Novice of Ricotta AKA NashCrash

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.