GRY-Online.pl --> Archiwum Forum

Proszę o pomoc z zapytanie SQL (MSSQL 2005)

22.08.2007
22:58
[1]

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 :)

22.08.2007
23:07
[2]

slowik [ NightInGale ]

order by powinno byc po FROM(...) blad mniejwiecej mowi o tym ze nie mozesz porzadkowac w podzapytaniach itd ...

22.08.2007
23:10
smile
[3]

Grzesiek [ Cezar ]

nie mozesz porzadkowac w podzapytaniach Esencja :-)

Jesteś wielki.
Dzięki po stokroć!

22.08.2007
23:11
[4]

slowik [ NightInGale ]

pozatym warto nieuzywac podzapytan szybsze sa kombinowane bez tego

22.08.2007
23:13
[5]

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.

22.08.2007
23:21
[6]

slowik [ NightInGale ]

jak wyglada to co masz wyciagnac z tej bazy ?

22.08.2007
23:31
smile
[7]

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 :]

22.08.2007
23:56
[8]

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

23.08.2007
00:04
[9]

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.

23.08.2007
00:10
[10]

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 ...)

© 2000-2024 GRY-OnLine S.A.