Visualizzazione dei risultati da 1 a 10 su 10

Discussione: query banalissima

  1. #1
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031

    query banalissima

    scusate ma faccio query ben più complesse e mi impianto di fronte a cotanta scemenza.

    Tabella:

    codice:
    id | campoa | campob
    1      aaa       5     
    2      bbb       9
    3      ccc       7
    Ora, voglio selezionare tutti i campi per quel record contenente il valore massimo in campob...
    E' la parte grassettata che mi blocca (select * from tabella where max(campob) infatti non funziona) altrimenti saprei cosa fare.


  2. #2
    codice:
    sql  = "SELECT TOP 1 * FROM tabella ORDER BY campob DESC"

  3. #3
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    sì, effettivamente a quello c'avevo anche pensato, ma una forma diversa proprio non esiste?
    Credo che quella forma richieda un ordinamento al contrario per poi tenere solo il primo... mentre la max forse è più performante in quanto cercherebbe soltanto il più alto senza passare ad ordinarli...

    Perchè la selezione del maggiore ad esempio è banale (select max(campob)), ma per selezionare oltre al maggiore anche gli altri campi usando una funzione di aggregazione come max, porta in errore la query poichè giustamente gli altri campi non sono parte di una funzione di aggregazione.... :master:

  4. #4
    La mia query seleziona un solo record, un recordset con un solo record (TOP 1).
    Se la lanci sulla gestione query di Access o su Query Analyzer ottieni un solo record, o, al massimo, N record che hanno lo stesso valore di campob.
    Fai come vuoi.

  5. #5
    Anche se tu dovessi riuscire a scrivere una query più complessa, mettendo in join la stessa tabella, prova ad analizzare il costo della query da Query Analyzer di SQL Server... vedrai che la TOP 1 costa di meno.

  6. #6
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    Originariamente inviato da Mems
    La mia query seleziona un solo record, un recordset con un solo record (TOP 1).
    Se la lanci sulla gestione query di Access o su Query Analyzer ottieni un solo record, o, al massimo, N record che hanno lo stesso valore di campob.
    Fai come vuoi.
    ???
    mica ho detto che la tua query non funziona... semplicemente che chiedendo un ordinamento DESC anche se limitato al primo record immagino che prima appunto di limitarlo debba ordinare tutto in ordine decrescente, quindi coinvolgere l'intera tabella, quando ipotizzavo che la max valutasse soltanto il campo passatogli come argomento... tutto qui, certo non mi metto a scrivere chissà cosa per arrivare a quella soluzione se esiste solamente quella forma. Il punto è proprio se è l'unica esistente.

  7. #7
    Originariamente inviato da Lak3d
    sì, effettivamente a quello c'avevo anche pensato, ma una forma diversa proprio non esiste?
    Credo che quella forma richieda un ordinamento al contrario per poi tenere solo il primo... mentre la max forse è più performante in quanto cercherebbe soltanto il più alto senza passare ad ordinarli...

    Perchè la selezione del maggiore ad esempio è banale (select max(campob)), ma per selezionare oltre al maggiore anche gli altri campi usando una funzione di aggregazione come max, porta in errore la query poichè giustamente gli altri campi non sono parte di una funzione di aggregazione.... :master:
    ...una cosa del genere potrebbe andare ?

    codice:
    select * from tabella
    where campob in (select max(campob) from tabella)
    ...ovvio che se se ci sono più campib pari al max(campob)
    avresti più di un record e dovresti porre un'altra condizione
    (anche top 1 volendo) per estrarne solo uno

  8. #8
    Originariamente inviato da Lak3d
    ???
    mica ho detto che la tua query non funziona... semplicemente che chiedendo un ordinamento DESC anche se limitato al primo record immagino che prima appunto di limitarlo debba ordinare tutto in ordine decrescente, quindi coinvolgere l'intera tabella, quando ipotizzavo che la max valutasse soltanto il campo passatogli come argomento... tutto qui, certo non mi metto a scrivere chissà cosa per arrivare a quella soluzione se esiste solamente quella forma. Il punto è proprio se è l'unica esistente.
    Anche nella MAX l'engine del db deve calcolarsi quale record ha il MAX... no?

  9. #9
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    @sspintux: valida sì, ma doppia query... mi stupisce comunque il fatto che la max non possa stare nella condizione where...

    @Mems: sì, però immagino non debba ordinarli tutti. boh, ipotizzo eh...

  10. #10
    Originariamente inviato da Lak3d
    @sspintux: valida sì, ma doppia query... mi stupisce comunque il fatto che la max non possa stare nella condizione where...

    @Mems: sì, però immagino non debba ordinarli tutti. boh, ipotizzo eh...
    beh... nessuno ti vieta di provare quale si adatti meglio alla tua situazione;

    occhio però a fare confronti significativi perché, per esempio,
    la seconda ad essere eseguita potrebbe essere avvantaggiata dal
    trovarsi già in cache sia i dati che i piani di esecuzione elaborati dalla prima

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 © 2026 vBulletin Solutions, Inc. All rights reserved.