[ lenny @ 12.02.2005. 15:29 ] @
Izvršim ovaj upit:
Code:
SELECT ime, prezime FROM autori ORDER BY prezime, ime

i dobijem sledeće rezultate:
Code:

Ime|Prezime
Laza|Lazić
Mika|Mikić
Pera|Petrović


Pitanje je sledeće: da li je moguće nekako proširiti gornji upit, da mi da i redni broj svakog reda dobijenog upitom, tj da mi doda dodatnu kolonu, redni broj:

Code:

RedniBroj|Ime|Prezime
1|Laza|Lazić
2|Mika|Mikić
3|Pera|Petrović

Ovo mi treba za složeni izveštaj. Znam da se može programski rešiti, ali me interesuje da li može i SQL da pomogne ovde?

Baza je MS SQL, verzija 7. Mislim da je to manje važno.
[ GoranVucicevic @ 12.02.2005. 16:25 ] @
Moze, ako imas kljuc koji bi u tvom slucaju bio AutorID onda bi resenje bilo
Code:

SELECT (SELECT COUNT(*) FROM autori autoriSUB WHERE autoriSUB.AutorID <= autoriMain.AutorID) AS RB, ime, prezime, AutorID 
FROM autori autoriMain
ORDER BY AutorID, prezime, ime


Naravno, ovo resenje je sporo, jer se prilikom formiranja rezultset-a za svaki slog izvrsava podupit za RB, a isto tako tebi podaci treba da su uredjeni po prezimenu, a ne po ID-, tako da ovo shvati samo kao interesantan primer.

Drugi nacin ti je da ti to vrati stored procedure.
Treci nacin ti je da formiras temporary table koja ce ti vratiti podatke koje trazis...
[ lenny @ 13.02.2005. 15:58 ] @
Citat:
GoranVucicevic
Code:

SELECT (
SELECT COUNT(*) FROM autori autoriSUB WHERE autoriSUB.AutorID <= autoriMain.AutorID
) AS RB, ime, prezime, AutorID 
FROM autori autoriMain
ORDER BY AutorID, prezime, ime




Interesantna ideja. Na nesreću meni je potrebno sortiranje po prezimenu, pa mi ova solucija ne rešava problem...

Verovatno ću morati da programski dopunim dataset sa rednim brojem...
[ djoca! @ 13.02.2005. 18:33 ] @
Koristi promenljive koje imas u MS SQL-u kao i u recimo MySQL-u.

Da ne lupam napamet posto nemam ovde instaliran MS SQL, ali varijanta npr

set @rank:=0;
select @rank:=@rank+1 as rank, ime, prezime FROM autori ORDER BY prezime, ime

bi bilo u MySQL-u, sad samo vidi sintaksu za MS SQL
[ degojs @ 13.02.2005. 19:47 ] @
Koristi privremenu tabelu u kojoj će prvo polje biti IDENTITY, a u ostala možeš onda samo da staviš primarne ključeve iz potrebnih tabela.
[ lenny @ 14.02.2005. 09:35 ] @
Citat:
djoca!: Koristi promenljive koje imas u MS SQL-u kao i u recimo MySQL-u.

set @rank:=0;
select @rank:=@rank+1 as rank, ime, prezime FROM autori ORDER BY prezime, ime



(Na svu nesreću,) radi se o MS SQL-u, verzija 7. Probao sam ovako, i dobio poruku o greški, koja mi stavlja na znanje da upit koji menja vrednost promenljive, ne može da se koristi i za izvlačenje podataka iz baze. Znači ili redni broj, ili podaci iz tabele...
[ _owl_ @ 14.02.2005. 14:24 ] @
Zar MS SQL nema neku pseudokolonu kaja sluzi upravo toj svrsi??
[ vujkev @ 12.12.2005. 10:56 ] @
Za Oracle je to ROWNUM pa ne verujem da MS SQL nema nešto slično
[ negyxo @ 12.12.2005. 13:05 ] @
Nazalost SQL Server sve do verzije 2000 nema podrsku za ovako nesto. Praksa je bila da se ide preko privremenih tabela u kombinaciji sa IDENTITY. Tek od vezije 2005 i SQLExpress-a je ubacena funkcija ROW_NUMBER() koja odlicno obavlja posao.
[ obucina @ 12.12.2005. 18:13 ] @
Ovo mozes da izvedes sa select stored procedurom.
[ Djoks @ 12.12.2005. 23:25 ] @
Nije skroz jednostavno, ali moze pomoci. Caka je da kreiras virtuelnu tabelu

sa jednom kolonom koja ce biti identity:


CREATE TABLE #statement (

[no] int identity,

person varchar(30),

route varchar(20),

cost decimal(6,2)

)


INSERT INTO #statement (person, route, cost)

SELECT

... tvoj upit


SELECT * FROM #statement


DROP TABLE #statement


Pozdrav!