Grzesiek [ Cezar ]
Proszę o pomoc z zapytanie SQL (MSSQL 2005)
Zapytanie wykonuję przez procedurę (Stored Procedure). Wykorzystuję w niej funkcję table-valued. Chciałbym też zastosować stronicowanie z poziomu procedury. Procedura:
ALTER PROCEDURE [dbo].[Show]
@id_list varchar(300),
@page int,
@page_size int
AS
WITH my_list AS (
SELECT ( (...),
ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNumber,
FROM (...)
WHERE (table_1.cat_id IN (SELECT *
FROM dbo.ReturnCategories(@id_list)))
(...)
ORDER BY current_date DESC
)
SELECT * FROM my_list
WHERE RowNumber BETWEEN 0 AND 10
Póki nie wrzuciłem do procedury funkcji ReturnCategories wszystko było OK. Kiedy wszystko wrzucam WITH my_list AS dostaję błąd:
The ORDER BY clause is invalid in views, inline functions, derive tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
Niewiele mi to mówi, dlatego się zwracam z prośbą o pomoc tutaj. Jeśli wyrzucę z bloku with as i usunę stronicowanie, to całe zapytanie śmiga. Jednak potrzebuję tego stronicowania jak wody :-)
Liczę na pomoc :)
slowik [ NightInGale ]
order by powinno byc po FROM(...) blad mniejwiecej mowi o tym ze nie mozesz porzadkowac w podzapytaniach itd ...
Grzesiek [ Cezar ]
nie mozesz porzadkowac w podzapytaniach Esencja :-)
Jesteś wielki.
Dzięki po stokroć!
slowik [ NightInGale ]
pozatym warto nieuzywac podzapytan szybsze sa kombinowane bez tego
Grzesiek [ Cezar ]
Niestety jestem zmuszony do tego typu wyjścia, z całych kombinacji, właśnie to wydaje się jedynym poprawnym wyjściem.
Odszedłem od dynamicznego SQLa, który i tak był z podzapytaniami na rzecz zaimplementowania funkcji w zapytaniu.
slowik [ NightInGale ]
jak wyglada to co masz wyciagnac z tej bazy ?
Grzesiek [ Cezar ]
Swego rodzaju forum jak GOL :P
Oprócz podstawowych danych (tytuł, data, id usera) musi zliczyć posty użytkownika + posty w wątku. Co ja będę się rozpisywał - jak na GOLu. Kategoria, podwieszanie, ignorowanie i jeszcze kilka innych bajerów, ale te już można zmieścić bez podzapytań.
To rozwiązanie stronicowania z poziomu SQLa jest chyba najwygodniejsze. Reasumując mam 2 podzapytanie zliczające (posty) i aż 4 albo 6 związanych z filtrowaniem (np. WHERE (table_1.cat_id IN (SELECT *
FROM dbo.ReturnCategories(@id_list))) ) - tych używam, by ominąć szerokim krokiem dynamiczny sql.
Co proponujesz w takim wypadku? Jeśli jest tragicznie oczywiście :]
slowik [ NightInGale ]
az 6 ? huh jeszcze troche i osiagniesz zlorzonosc n^3 :P ciezkie przejcia bedzie miala ta baza
stronnicowanie proponuje jednak przerzucic na kod systemu i poslugiwac sie limit'em
Grzesiek [ Cezar ]
A powiedz mi, gdybym
SELECT * FROM dbo.ReturnCategories(@id_list)
wrzucił do zmiennej i nią się posługiwał? Wtedy zamiast 6 zjechałbym do 3.
slowik [ NightInGale ]
to jedynie zmniejszenie obciazenie ze wzgledu na brak powtarzania tej samej akcji (ktorej wynik i tak jest pewnie buforowany jesli czesto sie powtarza ...)