Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di longline
    Registrato dal
    Sep 2001
    Messaggi
    5,363

    [SQL] SELECT TOP N non restituisce i primi N record

    Ciao a tutti.
    Ho notato un comportamento molto strano nell'istruzione sql SELECT TOP.
    Ho una tabella che contiene una quindicina di record con, tra gli altri, due campi data.

    Ho estratto i dati con questa sql:

    SELECT TOP 8 * FROM Contenuti WHERE lngTipo = 1 ORDER BY datRilievo DESC, datData DESC

    Purtroppo però ho notato che mi vengono restituiti tutti i record e non solamente i primi 8!

    Allora ho fatto qualche prova: con SELECT TOP 1 mi viene restituito solo un record! Con SELECT TOP 2 mi vengono restituiti solo due record! Con SELECT TOP 3 mi vengono restituiti tutti i record!

    Allora ho guardato tutti i record della tabella e ho notato che tutti i record, tranne due, hanno valori uguali nei campi datRilievo e datData. Ho quindi modificato i valori di questi campi e solo a questo punto la SELECT TOP ha restituito il numero di record richiesto!

    Alla luce di questi risultati, come si può definire il comportamento dell'istruzione SELECT TOP N?

  2. #2
    codice:
    SELECT TOP 8 * FROM Contenuti WHERE lngTipo = 1 ORDER BY datRilievo DESC, datData DESC
    Tutti e 15 i record della tabella contengono lngTipo = 1 ???

    Provare paura per un qualcosa che ti possa capitare nel futuro non ti evita quell'evento,ti fa soltanto vivere un presente sbagliato!

  3. #3
    Utente di HTML.it L'avatar di longline
    Registrato dal
    Sep 2001
    Messaggi
    5,363
    No, ma la WHERE non è determinante nel discorso che ho fatto...

  4. #4
    Utente di HTML.it L'avatar di longline
    Registrato dal
    Sep 2001
    Messaggi
    5,363
    Praticamente funziona così: immaginiamo di avere una tabella con record contenenti il nome di una calsse di una scuola e il rispettivo numero di alunni
    codice:
    classe  numeroalunni
    ---------------------
    1a      25
    1b      23
    1c      24
    1d      23
    La query

    SELECT TOP 2 * FROM Tabella ORDER BY numeroalunni DESC

    restituisce 2 record
    1a, 25
    1c, 24

    mentre la query

    SELECT TOP 3 * FROM Tabella ORDER BY numeroalunni DESC

    restituisce 4 record!
    1a, 25
    1c, 24
    1b, 23
    1d, 23

  5. #5
    Te ne restituisce 4 perchè il numero alunni è identico.
    Non so se questa è una falla della sintassi SQL sopra riportata da te, ma a mio avviso resta valida la soluzioni di apporre un ulteriore filtro alla WHERE per discriminare ancora di più i primi 8 che vuoi visualizzare.
    Provare paura per un qualcosa che ti possa capitare nel futuro non ti evita quell'evento,ti fa soltanto vivere un presente sbagliato!

  6. #6
    la TOP n funziona cosi'... nel caso citato da longline, vengono estratti anche gli ex-aequo: quale delle due classi da 23 alunni dovrebbe restare fuori dalla classifica?

  7. #7
    Utente di HTML.it L'avatar di longline
    Registrato dal
    Sep 2001
    Messaggi
    5,363
    Il funzionamento è chiaro.
    Ma mi chiedevo come si potrebbe enunciare il funzionamento della TOP

  8. #8
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Nella TOP la WHERE purtroppo è determinante.
    Dovresti ordinare anche per un campo che sicuramente sia diverso dagli altri, ad esempio un contatore.

    Roby

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.