Domanda

Compito:implementare il paging dei record del database adatto a diversi RDBMS.Il metodo dovrebbe funzionare con i motori tradizionali: MSSQL2000+, Oracle, MySql, ecc.

Si prega di non pubblicare soluzioni specifiche per RDBMS, so come implementarlo per la maggior parte dei moderni motori di database.Sto cercando la soluzione universale.Al momento mi vengono in mente solo soluzioni basate su tabelle temporanee.

MODIFICARE:
Sto cercando una soluzione SQL, non una libreria di terze parti.

È stato utile?

Soluzione

Ci sarebbe stata una soluzione universale se le specifiche SQL avessero incluso il paging come standard.Il requisito per qualsiasi linguaggio RDBMS di essere chiamato linguaggio RDBMS non include anche il supporto del paging.

Molti prodotti database supportano SQL con estensioni proprietarie al linguaggio standard.Alcuni supportano il paging come MySQL con la clausola limite, Rowid con Oracle;ognuno gestito in modo diverso.Altri DBMS dovranno aggiungere un campo chiamato rowid o qualcosa del genere.

Non penso che si possa avere una soluzione universale (chiunque è libero di smentirmi qui; aperto al dibattito) a meno che non sia integrata nel sistema di database stesso o a meno che non ci sia una società che dice ABC che utilizza Oracle, MySQL, SQL Server e loro decidere di fare in modo che tutti i vari sistemi di database forniscano la propria implementazione del paging da parte degli sviluppatori di database fornendo un'interfaccia universale per il codice che la utilizza.

Altri suggerimenti

Il modo più naturale ed efficiente per eseguire la paginazione è utilizzare il costrutto LIMIT/OFFSET (TOP nel mondo Sybase).Un modo indipendente da DB dovrebbe sapere su quale motore è in esecuzione e applicare il costrutto SQL corretto.

Almeno, questo è il modo in cui l'ho visto fare nel codice delle librerie indipendenti DB.Puoi astrarre la logica di paging una volta ottenuti i dati dal motore con la query specifica.

Se stai davvero cercando una soluzione con una sola frase SQL, potresti mostrare cosa hai in mente?Come l'SQL per la soluzione della tabella temporanea.Questo probabilmente ti darebbe suggerimenti più pertinenti.

MODIFICARE:

Volevo vedere cosa stavi pensando perché non riuscivo a vedere un modo per farlo con le tabelle temporanee e non utilizzare un costrutto specifico del motore.Nell'esempio hai utilizzato costrutti specifici.Ancora non vedo un modo per implementare il paging nel database solo con SQL standard (implementato).Potresti portare l'intera tabella in SQL standard e la pagina nell'applicazione, ma è ovviamente stupido.

Quindi la domanda sarebbe ora più simile a "C'è un modo per implementare il paging senza usare limite/offset o equivalente?" E immagino che la risposta sia "Sanely, no." Potresti provare a usare i cursori, ma cadrai anche frasi/comportamenti specifici del database.

Un'idea stravagante (leggi stupida) che mi è appena venuta in mente sarebbe quella di aggiungere una colonna di pagina alla tabella, ad esempio crea tabella test (id int, nome varchar, telefono varchar, pagina int) e quindi puoi ottenere la pagina 1 con select * dalla tabella dove pagina = 1.Ma ciò significa dover aggiungere codice per mantenere quella colonna, cosa che, ancora una volta, può essere eseguita solo portando l'intero database o utilizzando costrutti specifici del database.Questo oltre a dover aggiungere una colonna diversa per ogni possibile ordinamento e molti altri difetti.

Non posso fornire prove, ma penso davvero che non puoi farlo in modo sano.

Procedi come al solito:
Inizia implementandolo secondo lo standard.E poi gestire i casi angolari, ad es.i DBMS che non implementano lo standard.Il modo in cui gestire i casi limite dipende dall'ambiente di sviluppo.

Stai cercando un approccio "universale".Il modo più universale per impaginare è tramite l'uso di cursori, ma l'impaginazione basata su cursori non si adatta molto bene a un ambiente senza stato come un'applicazione web.

Ho scritto sullo standard e sulle implementazioni (inclusi i cursori) qui:http://troels.arvin.dk/db/rdbms/#select-limit-offset

SubSonic può farlo per te se puoi tollerare l'Open Source...http://subsonicproject.com/querying/webcast-using-paging/

A parte questo, so che lo fa anche NHib

JPA ti consente di farlo con la classe Query:

Query q = ...;
q.setFirstResult (0);
q.setMaxResults (10);

ti dà i primi 10 risultati nel set di risultati.

Se desideri una soluzione SQL grezza indipendente dal DBMS, temo che tu sia sfortunato.Tutti i venditori lo fanno diversamente.

@Vinko Vrsalovic,

come ho scritto in questione, so come farlo nella maggior parte dei DB.Voglio trovare una soluzione universale o ottenere la prova che non esiste.

Ecco una soluzione stupida basata sulla tabella temporanea.Ovviamente è brutto, quindi non c'è bisogno di commentarlo.

N - upper bound
M - lower bound

create #temp (Id int identity, originalId int)

insert into #temp(originalId)
select top N KeyColumn from MyTable
where ...

select MyTable.* from MyTable
join #temp t on t.originalId = MyTable.KeyColumn
where Id between M and M
order by Id asc

drop #temp
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top