[ toxi_programer @ 09.01.2008. 17:43 ] @
Pozdrav svima.
Naišao sam na problem, imam sledeći upit:
SELECT TOP 5 MemberID FROM MojaTabela WHERE MemberName LIKE 'tox%' ORDER BY Age DESC

Dakle, imam tabelu sa članovima i hoću da izlistam 5 najstarijih članova kojima ime počinje sa "tox" - na primer... Međutim ovo ne radi kako treba, tj. dobijeni rezultat je isti kao i da nema onog "TOP 5", dakle dobijem sve redove iz tabele.
Kada iz izraza izbacima onaj ORDER BY deo sve radi kako treba.
Koristim C# ( .NET 2.0) i MS Access bazu...

Šta mi je činiti?
[ Getsbi @ 09.01.2008. 19:32 ] @
Ako dva ili više zapisa imaju istu vrednost, svi će biti prikazani bez obzira na TOP n ako postoji i klauzula ORDER BY.
[ Zidar @ 09.01.2008. 21:02 ] @
Kod mene radi ovo:
Code:

SELECT TOP 5 Member, Age
FROM tblMembers
WHERE Member Like "tox*"
ORDER BY Age DESC;


Onako kako si ti napisao, ne treba da vrati nista :-) LIKE 'tox%' je MS SQL sintaxa. Access sintaxa je Like "tox*"
[ Getsbi @ 09.01.2008. 21:25 ] @
Ovo vraća sve zapise kod kojih je STIMUL = 0
Code:

SELECT TOP 5 RADNICI.PREZIME, RADNICI.STIMUL
FROM RADNICI
WHERE (((RADNICI.STIMUL)=0))
ORDER BY RADNICI.STIMUL;


a ovo vraća samo prvih 5
Code:

SELECT TOP 5 RADNICI.PREZIME, RADNICI.STIMUL
FROM RADNICI
WHERE (((RADNICI.STIMUL)=0));

Te dve klauzule se isključuju. Ili bolje rečeno druga poništava prvu.

Ovako bi bilo ispravno. ORDER BY nad kolonom koja ne učestvuje u uslovu:

Code:

SELECT TOP 5 RADNICI.PREZIME, RADNICI.STIMUL
FROM RADNICI
WHERE (((RADNICI.STIMUL)=0))
ORDER BY RADNICI.PREZIME;


Tačno je da to kod kolege nije slučaj ali možda nekom pomogne.



[Ovu poruku je menjao Getsbi dana 10.01.2008. u 08:00 GMT+1]
[ toxi_programer @ 09.01.2008. 21:38 ] @
Hvala, shvatio sam kako to ide i rešio sam problem, doduše na gluplji način - vrati se redova kolko se vrati, pa ako ima više redova nego što je pisalo u TOP-u onda taj višak izbacim iz DataTable objekta.


E sad me Zidar zbunio. :| Ja sam pisao svuda % a ne * i sve radi lepo( to sam naučio ovde ). Kada stavim * onda ne radi kako treba. A da nema to neke veze sa verzijom Jet-a?
[ Getsbi @ 09.01.2008. 21:44 ] @
Kod mene je isto kao i kod Zidara * znak za bilo koji niz u nastavku.
[ lukeguy @ 09.01.2008. 23:29 ] @
to ima veze sa SQL sintaksom. ako se ne varam, za SQL 92 su procenti,
a za ovu novu su zvezdice. a Access može da se konfiguriše koju da
koristi. a pošto čovek u ovom slučaju pristupa iz .Neta i pomoću
drajvera moguće je da drajver zahteva ovu notaciju sa procentima.
[ sallle @ 09.01.2008. 23:36 ] @
s obzirom da po sql standardu redosled redova nije garantovan, TOP n bez ORDER BY teoretski nema nikakvu upotrebnu vrednost...

Posto toxi koristi c#, i kaci se na access preko oleDB drajvera, lokalni accessovi dzoker karakteri ne bi trebalo da ga tangiraju, vec samo treba da fura sql standard, tj. '%'...
[ toxi_programer @ 09.01.2008. 23:58 ] @
Hvala celoj ekipi, imate po pivo kad se vidimo!
[ Zidar @ 10.01.2008. 16:25 ] @
meni su ovde novost bar dve stvari - 1) sto rece Getsbi da se TOP i ORDER BY se isključuju. Ili bolje rečeno druga poništava prvu. zvuci cudno, ali me nista ne cudi, Access ne prati SQL standarde u potpunosti. Nisma proveravao, ali dobro je negde u malom mozgu setiti se ovoga jkad zatreba.
2) nisam znao da se moze konfigurisati wildcard u Accessu

Za .net ne znam, ali ima logike. I iz Accesa kad saljes upit na MS SQL kucas * a drajver to prevede u %.

[ Getsbi @ 10.01.2008. 17:10 ] @
Možda bi prava izjava bila: TOP n neće vratiti samo n zapisa ako se bude zahtevao redosled (ORDER BY) po polju koje je učestvovalo u uslovu WHERE. Nešto o tome sam pročitao davno u nekom tutorijalu na netu pa mi sinoć palo napamet da proverim pošto je pitanje bilo vrlo blizu.
A možda je u pitanju zbilja neka nedoslednost Access-a. Neki dobar majstor za SQL kao Chachka bi mogao da nam to odgonetne.