Šta je novo?

SQL - prikazati redove obrnutim redosledom od unosa?

marin

Slavan
Učlanjen(a)
05.08.2005
Poruke
321
Poena
319
Pozdrav kolege, nesto me muci>

Ako je nekome bitno, koristim sql server 2008 r2 express edition.
Imam tabelu 'Klijenti' sa standardnim kolonama 'ime, prezime, adresa, ...' ali nema ID kolone,nego je primarni kljuc kolona 'jmbg'.

Ja bih sad preko sql select upita da prikazem redove obrnuto od onoga kako su upisivani. Znaci 'select * from klijenti', ali obrnut:)

Da postoji ID kolona koja je autoincrement, bilo bi lako, ali je nema...

Hvala.
 
Pozdrav kolege, nesto me muci>

Ako je nekome bitno, koristim sql server 2008 r2 express edition.
Imam tabelu 'Klijenti' sa standardnim kolonama 'ime, prezime, adresa, ...' ali nema ID kolone,nego je primarni kljuc kolona 'jmbg'.

Ja bih sad preko sql select upita da prikazem redove obrnuto od onoga kako su upisivani. Znaci 'select * from klijenti', ali obrnut:)

Da postoji ID kolona koja je autoincrement, bilo bi lako, ali je nema...

Hvala.

Zasto ne navedes koje redove hoces da ti prvo ispise sa 'SELECT Adresa, Prezime, Ime, ... from Klijenti'...
 
Ako nemas id (autoincrement) onda kako mislis da znas kojim su redosledom upisivani? To baza ne cuva :-/
 
Zevs> Jeste, ali vidis da kad uradis select upit, uvek ide tim nekim redosledom.. Valjda pravi neke indexe sa primarnim kljucom.
Posto je ovo za web aplikaciju asp.net, drugi nacin je promeniti redosled kasnije u aplikaciji, ali, mora, bre, da moze to SQL. Odgovara mi SQL iz nekih razloga... :)


Cutter> Ako umesto * navedem sve kolone, dobicu isti upit.
A meni sad treba upit kome ce prvi red biti onaj koji je ustvari poslednji u "select * from klijenti"
Reverse order.

*Dao mi je Cutter ideju... Navescu sve kolone koje postoje, pa cu posle ORDER BY po svim tim istim kolonama DESC, da vidimo da li daje to sto mi treba:) -- ne valja, isti rezultat kao i bez ORDER BY
 
Poslednja izmena:
Pozdrav kolege, nesto me muci>

Ako je nekome bitno, koristim sql server 2008 r2 express edition.
Imam tabelu 'Klijenti' sa standardnim kolonama 'ime, prezime, adresa, ...' ali nema ID kolone,nego je primarni kljuc kolona 'jmbg'.

Ja bih sad preko sql select upita da prikazem redove obrnuto od onoga kako su upisivani. Znaci 'select * from klijenti', ali obrnut:)

Da postoji ID kolona koja je autoincrement, bilo bi lako, ali je nema...

Hvala.

Pa nikako. Čak i taj select pitanje da li vraća result set koji je sortiran insertion order-u. Kad nemaš order by nema garancije u kojem će redovi biti sortirani. Pretpostavljam da nemaš ni timestamp, ali ako imaš, možeš po njemu da odradiš order by, ovako ne postoji način da garantovano dobiješ ono što želiš.
 
Valjda pravi neke indexe sa primarnim kljucom.

A tebi je primarni ključ JMBG. :)



*Dao mi je Cutter ideju... Navescu sve kolone koje postoje, pa cu posle ORDER BY po svim tim istim kolonama DESC, da vidimo da li daje to sto mi treba:)

Pa jedino ako ih i sada sortira po JMBG. Ne vidim kojom magijom to može da radi? Ako radi, onda ni ASC poredak nije insertion order nego neki drugi order. :)
 
Poslednja izmena:
Istripovao sam nesto da ti indeksi idu sekvencijalno, pa onda nekako.. Ali, jbm ga, cini mi se da select upit uvek izlazi isto, tj. redovi uvek istim redosledom. Zasto, ne znam:)

***, onda cu dodati ID kolonu samo zbog sortiranja...
Lakse nego smisljati drugo nesto. Ja mislio da ima neka laka 'caka'.

Hvala, a ako se neko ipak seti 'cake', tu sam:)
 
Poslednja izmena:
Ma nema cake, pogledaj dokumentaciju. Ako ne koristiš order by nema garancije za redosled sortiranja. A, da bi koristio order by, moraš da navedeš po kojim kolonama želiš da ti odradi sort, a ako nemaš takvu kolonu, prosto ne možeš ni da mu kažeš kako da sortira. :)
 
Poslednja izmena:
Shvatio da 'nema garancije' jos prvi put. Nije mi bitno za ovu aplikaciju toliko garancija da je to taj redosled 100%, ali je super i 99%:)

Resicu sa uvodjejnem ID kolone..
Hvala, Marko, za razbijanje iluzije:)
 
Da je neka legacy baza (što sam pretpostavio) pa i da lupaš glavom. Ako je praviš od nule, nemoj da imaš dilemu, odradi to kako treba. :)
 
Ne treba ti id kolona... Mozes i bez nje...

select @a:=0;
select *, @a:=@a+1 as a from klijenti order by a desc;
 
^
Time dobije obrnut redosled od default-nog ordera, ali defaultni order verovatno nije insertion order.

Test na brzinu:
+------+------+----------+
| JMBG | IME | PREZIME |
+------+------+----------+
| 8 | ime3 | prezime3 |
| 9 | ime2 | prezime2 |
| 10 | ime1 | prezime1 |
| 11 | ime4 | prezime4 |
+------+------+----------+
4 rows in set (0.00 sec)

Ime i prezime imaju kao sufix broj koji predstavlja realni redosled unošenja, dok je select * from Klijent vratio ovo gore. Očigledno da je sort odrađen po JMBG.
 
Poslednja izmena:
Hm, ali je super ideja:)
Mene nesto zeza sintaksa... Izbacuje mi " Incorrect syntax near ':'. ", pa sad googlam malo o varijablama...

-- pa sam dosao i do "A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations." ...
 
Poslednja izmena:
Marine, a zašto si ti baš navalio da odradiš stvar na pogrešan način? :)

Šta imaš protiv ID kolone? :D

Inače, ovo radi iz prve u MySQL, ali vidi šta vraća:

select * from Klijent;
+------+------+----------+
| JMBG | IME | PREZIME |
+------+------+----------+
| 8 | ime3 | prezime3 |
| 9 | ime2 | prezime2 |
| 10 | ime1 | prezime1 |
| 11 | ime4 | prezime4 |
+------+------+----------+
4 rows in set (0.00 sec)


select @a:=0;
select *, @a:=@a+1 as a from klijent order by a desc;

+------+------+----------+------+
| JMBG | IME | PREZIME | a |
+------+------+----------+------+
| 11 | ime4 | prezime4 | 4 |
| 10 | ime1 | prezime1 | 3 |
| 9 | ime2 | prezime2 | 2 |
| 8 | ime3 | prezime3 | 1 |
+------+------+----------+------+
4 rows in set (0.00 sec)
 
Poslednja izmena:
Odradicu ja sa ID kolonom, nego igramo se malo :)

Sazna se svasta dok ovako pricamo.

*Ovo Vampirovo radi bas kako treba, ali u korenu je problem :)
Meni ne radi, verovatno zato sto je MS SQL pa jos EE...
 
Poslednja izmena:
^
Time dobije obrnut redosled od default-nog ordera, ali defaultni order verovatno nije insertion order.

Na ovaj nacin ces dobiti u obrnutom redosledu od onog koji dobijes sa select * from klijenti... To najcesce i jeste insert order, ali ne mora da znaci (nek me neko ispravi ako gresim) Jedini nacin da radi po insert orderu je dodavanje timestamp kolone... mislim da u nekim slucajevima cak i ako koristis auto_inc i transkacije moze da se desi da auto_inc kolona ne bude po redosledu ubacivanja :)

@marin

nisi napisao koji sql server je u pitanju pa sam pretpostavio da je mysql... ne znam da li moze za mssql tako... nisam jos probao :)
 
Poslednja izmena:
To nije insert order, ako uradis update nekog polja, videces da ce se promeniti. Nek doda neki id i resio je problem :)
 
Evo sintakse za SQL Server
Kod:
select *, id=identity(int, 1, 1) into #Klijenti from Klijenti;
select * from #Klijenti order by id desc;
drop table #Klijenti;
Najbolje je dodati id polje u tabelu.
 
Zar ne moze to bez drop tabele? U MySQL mozes da uradis npr select * from (select * from tabela1)
 
Mozes da prvo uradis "select * from" pa da rezultate ubacis u array pa zatim obrnes taj array ali nisam siguran da su rezultati u prvom koraku sortirani po redosledu upisa.
 
Auuuu al ste zakomplikovali :) Evo ga upit bez uvođenja drugog ključa, kreiranja temp tabele i sl.
Kod:
SELECT * FROM Klijenti ORDER BY 1 DESC
 
Mislim da nisi procitao celu temu. Bez autoincrement ili nekog drugog "hronoloskog" polja, redosled nicim nije zagarantovan.
 
Pa zapravo za SQL SERVER vazi ovo:


Although SQL doesn't assume any given order to a table's rows, it does maintain ordinal positions for columns based on creation order. Specifying SELECT * (although a bad practice for several reasons that I'll describe later in the book) guarantees the columns would be returned in creation order.

Citat iz knjige Inside Microsoft SQL Server 2005 T-SQL Querying.

Mada, definitivno pravo resenje je sa timestamp-om.
 
Vrh Dno