Domanda

Lo so:

  • Firebird: FIRST e SKIP ;
  • MySQL: LIMIT ;
  • SQL Server: ROW_NUMBER () ;

Qualcuno conosce un modo ANSI SQL per eseguire il paging dei risultati?

È stato utile?

Soluzione

Vedi Limite & # 8212; con offset in questa pagina: http://troels.arvin.dk/db/rdbms/

A proposito, Firebird supporta anche la clausola ROWS dalla versione 2.0

Altri suggerimenti

Nessun modo ufficiale, no. *

Generalmente ti consigliamo di avere una funzione sottratta nel tuo livello di accesso al database per farcela; dare un suggerimento che sei su MySQL o PostgreSQL e può aggiungere una clausola 'LIMIT' alla tua query, oppure riesaminare una sottoquery per Oracle e così via. Se non sa che può fare uno di questi, torna a recuperare il lotto e restituire solo una parte dell'elenco completo.

*: eta: adesso c'è, in ANSI SQL: 2003. Ma non è supportato a livello globale, spesso si comporta male, ed è un po 'una seccatura perché devi spostare / copiare il tuo ORDINE in un nuovo posto nella dichiarazione, il che rende più difficile il wrapping automatico:

SELECT * FROM (
    SELECT thiscol, thatcol, ROW_NUMBER() OVER (ORDER BY mtime DESC, id) AS rownumber
)
WHERE rownumber BETWEEN 10 AND 20 -- care, 1-based index
ORDER BY rownumber;

Esiste anche il "FETCH PRIMO n SOLO FILO" suffisso in SQL: 2008 (e DB2, da dove è nato). Ma come il prefisso TOP in SQL Server e la sintassi simile in Informix, non è possibile specificare un punto iniziale, quindi è ancora necessario recuperare e eliminare alcune righe.

Al giorno d'oggi esiste uno standard, non necessariamente uno standard ANSI (la gente ha dato molte risposte, penso che questo sia il meno prolisso)

SELECT * FROM t1 
WHERE ID > :lastId
ORDER BY ID
FETCH FIRST 3 ROWS ONLY

Tuttavia, non è supportato da tutti i database, sotto un elenco di tutti i database che supportano

  • MariaDB: supportato da 5.1 (di solito, viene utilizzato il limite / offset)
  • MySQL: supportato dalla 3.19.3 (di solito, viene utilizzato il limite / offset)
  • PostgreSQL: supportato da PostgreSQL 8.4 (di solito, viene utilizzato il limite / offset)
  • SQLite: supportato dalla versione 2.1.0
  • Db2 LUW: supportato dalla versione 7
  • Oracle: supportato dalla versione 12c (utilizza sottoselezioni con la funzione row_num)
  • Microsoft SQL Server: supportato dal 2012 (in genere viene utilizzato top-N)

Puoi ovviamente usare lo stile offset, anche se potresti avere problemi di prestazioni

SELECT * FROM t1
ORDER BY ID
OFFSET 0 ROWS
FETCH FIRST 3 ROWS ONLY

Ha un supporto diverso

  • MariaDB: supportato da 5.1
  • MySQL: supportato dalla 4.0.6
  • PostgreSQL: supportato da PostgreSQL 6.5
  • SQLite: supportato dalla versione 2.1.0
  • Db2 LUW: supportato dalla versione 11.1
  • Oracle: supportato dalla versione 12c
  • Microsoft SQL Server: supportato dal 2012

Vorrei controllare le risposte a questa domanda - è probabile che ottenga hai iniziato tu.

Inserisci i risultati in una tabella di archiviazione, ordinato come desideri visualizzarli, ma con una nuova colonna IDENTITY.

Ora SELEZIONA da quella tabella solo l'intervallo di ID che ti interessa.

(Assicurati di ripulire il tavolo quando hai finito)


Oppure fallo sul client, poiché qualsiasi cosa abbia a che fare con la presentazione normalmente non dovrebbe essere eseguita su SQL Server (secondo me)

BTW, Troels, PostgreSQL supporta Limit / Offset

ANSI Sql example:
offset=41, fetchsize=10

SELECT TOP(10) *
FROM table1
WHERE table1.ID NOT IN (SELECT TOP(40) table1.ID FROM table1)

Per il paging è necessaria una colonna RowNo per filtrarla - che dovrebbe trovarsi su un campo come id - con due variabili come @PageNo e @PageRows . Quindi uso questa query:

SELECT *
FROM (
    SELECT *, (SELECT COUNT(1)
               FROM aTable ti
               WHERE ti.id < t.id) As RowNo
    FROM aTable t) tr
WHERE
    tr.RowNo >= (@PageNo - 1) * @PageRows + 1 
 AND
    tr.RowNo <= @PageNo * @PageRows 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top