Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326

    [firebird] select...where in (array)

    Ciao a tutti,

    db firebird

    devo eseguire questa select:

    select tabella.id from tabella where tabella.id in (1,2,3,4,5)

    ovviamente non ho solo 5 id da inserire ma un numero n dipendente dalla selezione manuale da un griglia da parte dell'utente.

    attualmente io scrivo la query in questa maniera:

    codice:
    IBQuery.SQL.Add('select tabella.id from tabella where tabella.id in ('+cxTextEditTuttiIdTabella.Text+')');
    
    dove:
    cxTextEditTuttiIdTabella.Text:='1,2,3,4,5'
    questa cosa funzione fino a che gli id sono un certo numero limitato...semmai anche 1500 id diversi

    pero, sicuramente esistono limiti e questo scherzetto non funge per un numero molto alto di id.

    avete un modo per passare questi parametri? semmai con una stringlist o un array?

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    è un bel po' che non uso più firebird, a "memoria" è proprio una limitazione sua, ovvero la difficoltà di gestire liste IN molto grandi.

    Anche mysql aveva lo stesso problema, rimosso però dalle "ultime" (per modo di dire) versioni.
    Ora è rimasto (per mysql) solo nella dimensione del "pacchettone".
    ---
    Forse (e dico forse) esiste una limitazione analoga per firebird

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    allora il limite è di 1500 parametri (su alcune versioni 1499 per un bug)... allora io ho provato a fare cosi:

    codice:
    select 
    tabella.id
    from tabella 
    where 
    tabella.id in (1,2,3,.....1500)
    or tabella.id in (1501,1502,1503,....3000)
    or tabella.id in (3001,3002,3003,....4500)
    .....
    ed anche in questo caso forse esistono dei limiti.
    la stringa mi da un errore ad una linea variabile...

    codice:
    SQL error code = -104.
    Unexpected end of command - line 20, column 74.
    forse dipendente dalla lunghezza del comando sql.

    non so cosa provare in alternativa.

    grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    ti dico cosa farei io (anche se non ci sono poi tantissimi dettagli).

    crea una tabella (fisica o in memoria, nel secondo caso se devi scrollarla spesso può convenire caricarla in RAM e poi scriverla tutta in un colpo prima della join) che registra le righe della griglia.
    In pratica fai una tdbgrid che opera con un tdatasource/tdataset.

    Lì fai "paciugare" l'utente (immagino abbia comandi del tipo "seleziona una riga, seleziona tutto, inverti selezione), mediante un campo flag, alla fine esegui la query come join con la tabella temporanea

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    Originariamente inviato da franzauker
    crea una tabella (fisica o in memoria, nel secondo caso se devi scrollarla spesso può convenire caricarla in RAM e poi scriverla tutta in un colpo prima della join) che registra le righe della griglia.
    In pratica fai una tdbgrid che opera con un tdatasource/tdataset.
    io saprei solo crearla fisicamente in un db e poi, tramite INSERT, aggiungerci tutti i record... ma credo impieghi molto tempo....

    come faccio a creare una tabella in memoria? e poi come si scrive tutto in un colpo?


    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da 123delphi321
    io saprei solo crearla fisicamente in un db e poi, tramite INSERT, aggiungerci tutti i record... ma credo impieghi molto tempo....

    come faccio a creare una tabella in memoria? e poi come si scrive tutto in un colpo?


    grazie
    TKbmemtable, ad esempio

    http://www.components4programmers.co...s/kbmmemtable/

    per "scriverla in un colpo" ti basta fare una transazione nella quale metti tutte le righe (dalla tabella RAM sulla tabella fisica).

    Non riusciresti infatti (con facilità) a fare un join tra una tabella firebird ed una in memoria (in realtà sarebbe pure possibile, ma con prestazioni bassissime).

    Se la cosa "ti turba" usa una tabella "fisica"
    Magari se hai un'applicazione con N client mettici pure un codice_client, così non "mischi" le righe

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.