2010-10-11 14 views
5

muszę napisać kwerendę w następujący sposób, który zostanie przyłączony do siecimuszę napisać zapytanie SQL, aby wyświetlić 25 najlepszych rekordy z połowu

select top 25 * from ErrTable Order by DateErrorad Desc 

Jednak muszę napisać to zapytanie do powrotu tylko 25 rekordów na raz, ale gdy użytkownik kliknie obok, wyświetli 25 kolejnych rekordów z bazy danych.

Jak mogę to zrobić?

+1

Które SQL-serwer są uruchomione? – Merrimack

+0

OK, Will używa MSSQL. –

+0

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

Odpowiedz

0

Możesz użyć polecenia LIMIT do wybrania wpisów z danego zakresu. Jednak nie jestem pewien, czy wszystkie silniki wspierać go, więc bardziej ogólne rozwiązanie (choć mniej wydajne, I liczyć), jest ...

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

Przepraszamy za luźnej definicji, wyjeżdżam i może nie odpowiadaj bardziej szczegółowo.

+0

OK, więc miej datę: – Will

+0

elect top 25 * od ErrTable Order by DateErrorad Desc gdzie dataedrored <2010-10-11 15:54:00 – Will

+0

A twoja edycja nadal nie pomaga ... –

0

W MySQL można to zrobić za pomocą LIMIT, w MSSQL nie wiem, czy to działa.

SELECT * FROM table LIMIT 10 

lub

SELECT * FROM table LIMIT 0, 10 

Spowoduje to wyświetlenie pierwszych 10 wyników z bazy danych.

SELECT * FROM table LIMIT 5, 5 

To pokaże rekordy od 6 do 10

2

Ok, ponieważ nie wiem, co Database Server/silnik, ale w zasadzie trzeba będzie zakres (w przypadku 25) i numer strony (np 0 to pierwsza strona, 1 dla następnej strony z 25 rekordów itp.).

W MySQL, można to zrobić (za pomocą polecenia LIMIT) ....

SELECT * FROM TABLE LIMIT START, RANGE; 

gdzi TABLE to nazwa tabeli, START jest twój wskaźnik start/zakres, na przykład, jeśli masz rekord 0 - 24, możesz ustawić start = 25, aby przeczytać następne 25 (w tym miejscu pojawia się RANGE).

Jest to dostępne tylko w MySQL, w DB2 jest inne. Dowiedz się, kto twój serwer/silnik bazy danych obsługuje paginację.

W DB2:

SELECT * FROM TABLE FETCH FIRST N ROW ONLY; 

przypadku N jest wartością numeryczną.

Edit Dla MSSQL, można zobaczyć kolejny Related Post:

Oto artykuł, który pokazuje Paging in ASP.NET.

+0

Oh ok pozwól mi spróbować, taht – Will

+0

Limit nie jest wbudowany w MSSQL – Will

+0

Jeśli czytasz mój post, to powiedział, że działa w 'MySQL'. –

0

Zakładając, że używasz programu SQL Server (na podstawie ASP.NET tag):

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 

Zdecydowanie polecam korzystanie z ORM. Kocham LINQ-SQL (jest to doskonałe uzupełnienie do ASP.NET), i że można z tym zrobić, jak:

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

czy możesz to wyjaśnić? Select *, rank() over (order by DateErrorad desc) as i – Will

+0

Możesz znaleźć wiele tutoriali w Internecie dla funkcje rankingowe. Oto jeden: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q186133 –

0

Myślę, że to zależy od DBMS następujące linq2sql-query (tabela DatabaseLogs z AdventureWorks)

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

generuje następujące zapytanie do MSSQL

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

tworząc procedury przechowywanej i przechodzi swój zakres

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' nie jest rozpoznawaną nazwą funkcji. – Will

+0

@ Czy używasz serwera sql 2000? – DForck42

Powiązane problemy