@nadavesela
Ajde da isteramo stvar do kraja :-)
Sada je sintaksa ispravna, OK:
Citat:
SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT top 10 id from
(
( SELECT id, 1 as redosled FROM web_fix_table )
UNION
( SELECT TOP 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID() )
) unija
order by redosled,id
)
Originalni kveri koji si postavila nije imao SELECT TOP u delu unije koji cita iz web_view, zato sam se bunio za sintaksu. Sada je OK, sintaksno.
Medjutim, jos uvek nema garancije da ce glavni kveri vratiti ispravan redosled. Jos jedno medjutim, to ipak moze da bude dovoljno dobro za postavljaca pitanja, zavisi od samih podataka.
Da proanaliziramo poslednji kveri koji si napisala. Malo sam ga formatirao, da se lakse vidi sta je sta. Evo ga kveri:
Code:
SELECT TOP 10 * FROM _glavni_view --- glavni kveri
WHERE ident in
(
SELECT TOP 10 id -- subquery nivo 1
FROM
(-- unija = subquery nivo 2
SELECT id, 1 as redosled FROM web_fix_table
UNION
SELECT TOP 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID()
) AS unija
order by redosled,id
)
subquery unija ce vartiti 1) sve redove iz web_fix_table 2) 10 slucajno izabranih redova iz web_view
subquery nivo 1 ce vratiti 10 prvih redova iz unije, tako da ce se prvo pojaviti redovi iz web_fix_table
(Redosled=1) pa onda redovi iz web_view (Redosled = 2). Ako tabela web_fix_table sadrzi 10 ili vise redova, onda se redovi iz web_view dela unije nece uopste pojaviti u
subquery nivo 1
Glavni kveri jednostavno povuce TOP 10 iz
subquery nivo 1. Posto
subquery nivo 1 moze imati maksimalno 10 redova, onda ispada da nam glavni kveri i ne treba. Ako
subquery nivo 1 ima deset redova, onda ce oni svi biti iz
web_fix_table
. Zbog toga mi je TOP 10 u
subquery nivo 1 jako sumnjivo, kao i TOP 10 u glavnom kveriju.
Znaci, ako web_fix_table ima vise od 9 redova, onda nam se redovi iz web_view nikada nece videti na izlazu. To nije razumna propozicija, pa verujam da nam postavljac teme nije rekao bas sve.
Ako ne bi bilo TOP 10 u " subquery nivo 1 " onda se moze govoriti o redosledu u glavnom kveriju. Tad bi glavni kveri povlacio sve redove iz " subquery nivo 1 ", verovatno bi ih bilo vise od 10 ukupno, i normalno, zeleli bismo da ih vidimo u zeljenom redosledu. Ocigledno je da nam onda treba unija.redosled i na tom zavrsnom nivou. Tehnicki, ne mora JOIN da se upotrebi da se Unija digne na nivo glavnog kverija, moze i subquery, ali je znatno slozeniji nego sto sada imamo, tako da JOIN na kraju verovatno dodje jeftinije i lakse za pisanje resenje.
Ako nam sad @nada pokaze reenje sa subquerijem, tako da ne moramo JOIN, imacemo dodatni alat u arsenalu, ili bar kako se ista stvar moze resiti na vise nacina. Uvek je moguce da u datoj situaciji jedno resenje bude efikasnije od drugog. Ali, kada se situacija promeni, moze biti obrnuto. Zato je lepo imati vise resanja, sloboda izbora je velika stvar.
:-)