2009-05-06 16 views
14

W SQL Server, TOP może być użyty do zwrócenia pierwszej n liczby wierszy w zapytaniu. Na przykład: Ekwiwalenty SQL Server TOP

SELECT TOP 100 * FROM users ORDER BY id
może zostać użyty do zwrócenia pierwszych 100 osób zarejestrowanych dla witryny. (To niekoniecznie jest najlepszy sposób, używam go jako przykładu).

Moje pytanie brzmi - jaki jest odpowiednik TOP w innych bazach danych, takich jak Oracle, MySQL, PostgreSQL, etc? Jeśli nie ma odpowiednika słowa kluczowego, jakie rozwiązania można zalecić, aby osiągnąć ten sam wynik?

+0

Duplikat: http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-keyword –

+0

Technicznie tak. Ale tylko wtedy, gdy znasz słowo kluczowe LIMIT mysql, którego nie miałem wtedy. –

Odpowiedz

20

najpierw wybrać 100 wiersze:

MySQL i PostgreSQL:

SELECT * 
FROM Table 
ORDER BY 
     column 
LIMIT 100 

Oracle:

SELECT * 
FROM (
     SELECT t.* 
     FROM table 
     ORDER BY 
       column 
     ) 
WHERE rownum <= 100 

Uwaga że trzeba podkwerenda tutaj. Jeśli nie dodasz podkwerendy, ROWNUM wybierze pierwsze wiersze 10 w losowej kolejności, a następnie posortuje je według column.

do wybierania wierszy pomiędzy 100 i 300:

MySQL:

SELECT * 
FROM TABLE 
ORDER BY 
     column 
LIMIT 100, 200 

PostgreSQL:

SELECT * 
FROM Table 
ORDER BY 
     column 
OFFSET 100 LIMIT 200 

Oracle:

SELECT * 
FROM (
     SELECT t.*, ROW_NUMBER() OVER (ORER BY column) AS rn 
     FROM table 
     ) 
WHERE rn >= 100 
     AND rownum <= 200 

Należy zauważyć, że próba uproszczenia go za pomocą ROWNUM BETWEEN 100 AND 200 (w przeciwieństwie do rn BETWEEN 100 AND 200 w zapytaniu zewnętrznym) nie zwróci nic w postaci Oracle!

RN BETWEEN 100 AND 200 będzie działać również w Oracle, ale jest mniej wydajny.

Zobacz artykuł w moim blogu dla wydajności szczegóły:

+0

dlaczego nie jest to standardowe? co napisałem na @ocdecia nie jest wcale jasne, uważam, że notacje mysql i postgre są najlepsze. – Pablote

+0

@Pablote: ponieważ Oracle jest starszy ode mnie, a Sybase (na którym oparty jest SQL Server) jest tylko o 4 lata młodszy. W tamtym czasie nie było standardów. I do czasu pojawiły się standardy, o wiele za dużo kodu już istniało, aby cokolwiek zmienić. – Quassnoi

+0

@Pablote: co @ocdecio zamieszczone są funkcje anayltic, a nie ograniczenie zestawu rekordów. Można ich użyć do ograniczenia zestawów rekordów, ale nie jest to ich główny cel. – Quassnoi

1
LIMIT 100 

jak w

SELECT * FROM foo ORDER BY bar LIMIT 100 
6

Dla PostgreSQL i MySQL to słowo kluczowe LIMIT.

SELECT * 
    FROM users 
ORDER BY id 
LIMIT 100; 
1

Można użyć RANK() i DENSE_RANK() w Oracle. Here to link do strony AskTom wyjaśniającej, w jaki sposób do stronicowania i najczęstszych zapytań z DENSE_RANK w Oracle.

1

Oracle:

select * from (select * from foo ORDER BY bar) where rownum < 100 

Z ładnym wyjaśnienia na temat sposobu, aby to działało w AskTom.

W Ingres to samo zapytanie będzie przez:

select First 100 * from foo ORDER BY bar 

Ingres pytanie została już udzielona odpowiedź StackOverflow wcześniej.

+0

tak, zapytanie powinno faktycznie przez: select * from (select * from celu foo przez bar) gdzie rownum <100 uzyskać Top 100 po zamawiania ... – Sean

+0

Ups, które powinny być <= 100 jako rownum zaczyna się od 1 – Sean

3

Jest to standardowy SQL (Oracle i SQL Server wdrożyć go). Jest to przykład zwracania do 100 wierszy:

 SELECT ID_CONTROL FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID_CONTROL) 
     ROWNUMBER, ID_CONTROL FROM IWS_CONTROL WHERE 
     CURRENT_STATE = 15 AND CURRENT_STATUS=0) A WHERE ROWNUMBER <= 100) 
+0

To jest fajne. nie wiedziałem, że możesz to zrobić. – Zack

0

W Oracle chcesz użyć zapytania TOP-N.

Na przykład:

select * 
    from (SELECT * 
      FROM foo 
      where foo_id=[number] 
     order by foo_id desc) 
where rownum <= 3 

To będzie Ci trzy najlepsze wyniki (bo zamówić przez desc w zapytaniu sub)

1

W DB2 chciałbyś zrobić swój wygląd kwerendy tak:

SELECT * FROM tblData FETCH PIERWSZE 10 WIERSZY TYLKO;

2

W SQL Anywhere, to tak samo jak SQL Server:

SELECT TOP 100 * FROM users ORDER BY id 

Można nawet rozpocząć się w środku zestaw wyników, jeśli chcesz:

SELECT TOP 100 START AT 50 * FROM users ORDER BY id 

dostaje 50. przez 150 wierszy zestawu wyników.