2010-10-11 9 views
5

ho bisogno di scrivere una query come segue che saranno legate ad una grigliaHo bisogno di scrivere una query SQL per visualizzare top 25 record con una cattura

select top 25 * from ErrTable Order by DateErrorad Desc 

Tuttavia, ho bisogno di scrivere questa query per tornare solo 25 record alla volta, ma quando un utente fa clic su Avanti visualizzerà i prossimi 25 record più recenti dal db.

Come posso realizzare questo?

+1

cui SQL server sono in esecuzione? – Merrimack

+0

Ok, Will sta utilizzando MSSQL. –

+0

Possibile duplicato: http://stackoverflow.com/questions/603724/how-to-implement-limit-with-microsoft-sql-server –

risposta

0

È possibile utilizzare il comando LIMIT per selezionare le voci in un determinato intervallo. Tuttavia, io non sono sicuro se tutti i motori lo supportano, quindi una soluzione più generale (anche se meno efficienti, mi sa), è ...

SELECT TOP 25 * 
FROM YOURTABLE 
WHERE IDCOL NOT IN (SELECT TOP 25 * FROM YOURTABLE) 

Ci scusiamo per la definizione sciolto, me ne vado e CAN rispondere in modo più dettagliato

+0

Ok quindi ho una data: – Will

+0

eleggo top 25 * da ErrTable Order by DateErrorad Desc where dateerrored <2010-10-11 15:54:00 – Will

+0

E la tua modifica continua a non aiutare .... –

0

In MySQL lo si può fare con LIMIT, in MSSQL non so se funziona.

SELECT * FROM table LIMIT 10 

o

SELECT * FROM table LIMIT 0, 10 

Questo mostrerà i primi 10 risultati dal database.

SELECT * FROM table LIMIT 5, 5 

Questo mostrerà record 6-10

2

Ok, dal momento che non so cosa Database Server/motore, ma fondamentalmente si avrà bisogno di un intervallo (nel tuo caso 25) e un numero di pagina (ad esempio, 0 è la prima pagina, 1 per la pagina successiva di 25 record, ecc.).

In MySQL, si può fare questo (utilizzando il comando LIMIT) ....

SELECT * FROM TABLE LIMIT START, RANGE; 

Wher TABLE è il vostro nome della tabella, START è il vostro indice di partenza/intervallo, ad esempio, se si dispone di record di 0 - 24, puoi impostare start = 25, per leggere il prossimo 25 (che è il punto in cui entra in gioco RANGE).

Questo è disponibile solo in MySQL, in DB2 è diverso però. Scopri chi il tuo server/motore DB gestisce l'impaginazione.

In DB2:

SELECT * FROM TABLE FETCH FIRST N ROW ONLY; 

Dove N è un valore numerico.

Modifica Per MSSQL, si può vedere un altro post correlati:

Ecco un articolo che mostra Paging in ASP.NET.

+0

Oh ok fammi provare, taht – Will

+0

Il limite non è incorporato in MSSQL – Will

+0

Se leggi il mio post, io ha detto che funziona in 'MySQL'. –

0

Supponendo che si stia utilizzando SQL Server (basato su ASP.Tag NET):

declare @offset int 
set @offset = 25 

select * from (
    select *, row_number() over (order by DateErrorad desc) as i from ErrTable 
) a 
where i <= @offset + 25 and i > @offset 

Consiglio vivamente di utilizzare un ORM, però. Amo LINQ to SQL (è un complemento perfetto per ASP.NET), e con questo si potrebbe fare questo come:

var rows = Errors.Skip(offset).Take(25); 
+0

puoi spiegare questo? Select *, rank() over (ordina per DataErrorad desc) come i – Will

+0

Puoi trovare molti tutorial sul web per funzioni di classificazione. Eccone uno: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q186133 –

0

Credo che dipende dal vostro DBMS, la seguente LINQ2SQL-query (tabella DatabaseLogs da AdventureWorks)

using (DataClasses1DataContext context = new DataClasses1DataContext()) 
{ 
    context.Log = Console.Out; 
    var qq3 = context.DatabaseLogs.Skip(20).Take(10).ToList(); 
} 

genera la seguente query per MSSQL

0.123.516,410617 millions
SELECT [t1].[DatabaseLogID], [t1].[PostTime], [t1].[DatabaseUser], [t1].[Event], [t1].[Schema] AS [Schema], [t1].[Object], [t1].[TSQL], [t1].[XmlEvent] 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[DatabaseLogID], [t0].[PostTime], [t0].[DatabaseUser], [t0].[Event], [t0].[Schema], [t0].[Object], [t0].[TSQL]) AS [ROW_NUMBER], [t0].[DatabaseLogID], [t0].[PostTime], [t0].[DatabaseUser], [t0].[Event], [t0].[Schema], [t0].[Object], [t0].[TSQL], [t0].[XmlEvent] 
    FROM [dbo].[DatabaseLog] AS [t0] 
    ) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 
ORDER BY [t1].[ROW_NUMBER] 
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [20] 
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [10] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1 
0

con la creazione di una stored procedure e passare il vostro gamma

create procedure dbo.SelectWindow 
@start int, @end int 
as 
begin 

select * 
from 
(
select 
*, 
row_number() (order by ID) as Row 
from dbo.table 
) a 
where Row between @start and @end 


end 
go 
+0

'row_number' non è un nome di funzione riconosciuto. – Will

+0

@Will, stai usando sql server 2000? – DForck42

Problemi correlati