Pracuję na SQL Server 2005, gdzie mam dwie tabele, takie jak ta:

tabela1

ID (Guid) Primarykey
something1 (string)
something2 (string)

I

tabela2

ID (Guid) Primarykey
Table1ID (Guid) is a ForeignKey to Table1
OrderNr (int)
something1 (string)
something2 (string)

Teraz muszę wykonać zapytanie wybierające (które daje mi setki wyników), w zasadzie coś takiego: SELECT * from Table2 where something1 = 'foo' order by Table1ID, OrderNr

Szczególnie ważna jest kolejność według, nie mogę tego zmienić. A instrukcja jest w rzeczywistości o wiele bardziej skomplikowana z dużą ilością złączeń, podselekcji, gdzie i tak dalej, ale nie są one tutaj potrzebne...

Mój problem polega na tym, że potrzebuję specjalnego stronicowania: po prostu zaznacz wszystkie wiersze z 20 różnymi identyfikatorami Table1ID, zaczynając od ID 10 do ID 15. (Oznacza to Chcę stronicowania, ale nie na liczniku wierszy, ale na tych kolumnach o unikalnych wartościach )

Gdybym miał zagnieżdżone select lub wywołanie funkcji, które dodaje iterowany numer instrukcji select, mógłbym użyć pomiędzy, ale jak mogę policzyć unikalne identyfikatory i dodać je do zapytania tam na górze?

Dziękuję za pomoc, Karl

0
abc 18 październik 2012, 15:06

2 odpowiedzi

Najlepsza odpowiedź

Właściwie jest to podobne do tego, co powiedział Tim Schmelter, ale nie ROW_NUMBER() OVER (PARTITION BY... ale DENSE_RANK() OVER (ORDER BY Table1ID) AS rank

Wyjaśnienie: DENSE_RANK robi dokładnie to, czego chcę. Uporządkowuje tabelę, w moim przypadku według Table1ID. Efekt jest taki, że każdy Table1ID ma swój własny numer rangi. Dzięki rank between 10 and 15 dostaję dokładnie to, czego chciałem.

Tank ci, Karl

1
Karl 18 październik 2012, 15:47

Możesz użyć ROW_NUMBER z Partition By:

WITH CTE AS
(
   SELCT Columns, ...
       , RN = ROW_NUMBER() OVER (PARTITION BY Table1IDs ORDER BY ID)
   FROM dbo.Table
)
SELECT Columns, ...
FROM CTE
WHERE RN BETWEEN 10 AND 15

(lub źle zrozumiałem twoje wymaganie, co nie jest bardzo mało prawdopodobne)

2
Tim Schmelter 18 październik 2012, 15:11