# ORDER BY in postggresql?



## EOB (22. Feb 2007)

hallo, habe folgende query, welche nuter mysql prima funzt.


```
SELECT DISTINCT b.id FROM baat b LEFT JOIN produsent p 
ON (b.produsentid = p.id) LEFT JOIN baatutstyr bu 
ON (b.id = bu.baatid) LEFT JOIN utstyr u 
ON (u.id = bu.utstyrid) LEFT JOIN kategori k 
ON (u.kategoriid = k.id) LEFT JOIN forhandlerbaat fb 
ON (b.id = fb.baatid) LEFT JOIN forhandler f
ON (f.id = fb.forhandlerid) LEFT JOIN importorbaat ib 
ON (b.id = ib.baatid) LEFT JOIN importor i 
ON (i.id = ib.importorid) WHERE b.modell LIKE '%day%' OR b.produksjonsland LIKE '%day%' 
OR b.lang_beskrivelse LIKE '%day%'
OR b.kort_beskrivelse LIKE '%day%' OR b.ovrige_opplysninger LIKE '%day%' OR b.byggemateriale LIKE '%day%' OR b.baattype LIKE '%day%' OR p.pnavn LIKE '%day%' 
OR k.knavn LIKE '%day%' OR f.fnavn LIKE '%day%' OR i.inavn LIKE '%day%' ORDER BY p.pnavn ASC;
```

allerdings wirft er mir unter postgresql diese meldung: _ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list _

wo muss denn das order by sonst hin? in die select liste, aber wo? hab schon so ziemlich alles durch!?

vielen dank


----------



## thE_29 (22. Feb 2007)

Dh, die expression (p.pnavn) muss vorne im select stehen sodaß er nach der sortieren kann!

Irgendwie komisch...
Probier mal select A from A order by B

also mach ein order by das net angezeigt wird.. Wenn das postgres net kann, ist die DB ja nur noch fürn Hugo :>

Normalerweise kommen solche Meldungen bei having (da der Therm dann ja im group by vorkommen muss) oder wenn man order by 2 und man selektiert nur eine Spalte!


----------



## EOB (22. Feb 2007)

also ohne order by gehts und im netz findet man schon beispiele, aber dummerweise komm ich nicht klar, da ich noch die joins hab...ausserdem ist p ja nicht direkt in der select liste  :bahnhof: .

hm....noch ideen?

danke


----------



## thE_29 (22. Feb 2007)

Naja, ich bin ein Oracle Mensch und hab nur am Rande mal was für Postgres gemacht...

Alleine schon diese Left Join verwirrt mich.. In Oracle machst da einfach beim from bla a, blub b, barr c etc.. hin


So hab mal unsere selects mal durchgeguckt und das hier jemand hinten ein order by hatte mit nem Typ den es vorne nicht gibt, hat eigentlich keiner... (zumindest unter Postgres)

Probier mal so: SELECT DISTINCT b.id FROM baat b,produsent p LEFT JOIN baatutstyr bu
ON (b.id = bu.baatid) .... (hier restlicher SQL bis zur where)
where b.produsentid = p.id ... (hier restliches where + order by)


----------



## Yzebär (23. Feb 2007)

Mørketid hat gesagt.:
			
		

> allerdings wirft er mir unter postgresql diese meldung: _ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list _
> 
> wo muss denn das order by sonst hin? in die select liste, aber wo? hab schon so ziemlich alles durch!?
> 
> vielen dank



Nicht das "ORDER BY" muß in die select-Liste, sondern "p.pnavn", wonach du sortieren möchtest. Wie sollte er denn deiner Meinung nach das Resultset nach einer Spalte sortieren, die es (im Resultset) gar nicht gibt?

Daß es bei einer anderen Datenbank funktioniert, heißt nicht, daß es richtig ist. Weißt du denn, ob bei MySQL das "ORDER BY nichtvorhandene_spalte" nicht ignoriert wird? Vielleicht wird bei MySQL das Resultset automatisch um eine nicht sichtbare Spalte erweitert und PostgresSql macht das nicht... 

Wenn du aber die select-Liste erweiterst, funktioniert aller Voraussicht nach dein DISTINCT nicht mehr...


----------



## thE_29 (23. Feb 2007)

1. habe ich das schon geschrieben
2. kann das Pervasive, MsAccess/JetEngine, Oracle, MSSQL

Schon komisch das es postgres nicht kann.. 

Ich glaube das hat nämlich was mit den JOINs zum tun und nicht ob es explizit ausgegeben wird!

Er will nach was sortieren was im FROM nicht angegeben ist! Diese Left JOIN bla ON irgendwas klappt da net ganz!


----------



## robertpic71 (23. Feb 2007)

1. Das Problem liegt nicht an den JOINS

Der LEFT OUTER Join ist SQL-Standard und wird fast von jeder Datenbank verstanden. Im Oracle werden/wurden die "Left outer Joins" in der Where-Klausel mit (+) gekennzeichnet. Aber laut SQL-Lehrbuch ist das die "alte" Schreibweise.

siehe auch v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm#leftjoin

2.Zum Problem:

Ich kann die Fehlermeldung auch mit einem kurzen Statement provozieren:

```
SELECT DISTINCT accounts.short
FROM public.accounts accounts
ORDER BY accounts.id
```
[Edit: Group By entfernt, war fehler beim Kopieren]

--> Ergibt genau die gleiche Fehlermeldung
--> PostgreSQL (ich habe hier 7.4) kann das nicht - einige der wenigen Sachen, die es nicht kann

3.) der Work-a-round:

Mein kleines Statement funktioniert trotzdem so:

```
SELECT accounts.short, Min(accounts.id)
FROM public.accounts accounts
GROUP BY accounts.short
ORDER BY Min(accounts.id)
```

für dein Beispiel würde das heißen:


```
SELECT b.id, min(p.pnavn) FROM baat b LEFT JOIN produsent p
ON (b.produsentid = p.id) LEFT JOIN baatutstyr bu
ON (b.id = bu.baatid) LEFT JOIN utstyr u
ON (u.id = bu.utstyrid) LEFT JOIN kategori k
ON (u.kategoriid = k.id) LEFT JOIN forhandlerbaat fb
ON (b.id = fb.baatid) LEFT JOIN forhandler f
ON (f.id = fb.forhandlerid) LEFT JOIN importorbaat ib
ON (b.id = ib.baatid) LEFT JOIN importor i
ON (i.id = ib.importorid) WHERE b.modell LIKE '%day%' OR b.produksjonsland LIKE '%day%'
OR b.lang_beskrivelse LIKE '%day%'
OR b.kort_beskrivelse LIKE '%day%' OR b.ovrige_opplysninger LIKE '%day%' OR b.byggemateriale LIKE '%day%' OR b.baattype LIKE '%day%' OR p.pnavn LIKE '%day%'
OR k.knavn LIKE '%day%' OR f.fnavn LIKE '%day%' OR i.inavn LIKE '%day%' GROUP BY b.id ORDER BY min(p.pnavn) ASC;
```

Ich kann das Statement nicht prüfen, müsste aber so funktionieren. Statt DISTINCT gibt es eine Gruppe um dem Order By genüge zu tun, macht man einfach irgendeine Gruppenfunkion für p.pnavn.


----------



## thE_29 (26. Feb 2007)

Dein select dort oben liefert aber unter Oracle genauso einen Fehler!

Es ist ein Unterschied ob man mit group by arbeitet oder nicht! Das sind dann 2 verschiedene paar Schuhe!

Er hingegen arbeitet ohne group by und deswegen ist es einfach komisch dass das PostGres nicht kann!


----------



## robertpic71 (26. Feb 2007)

thE_29 hat gesagt.:
			
		

> Dein select dort oben liefert aber unter Oracle genauso einen Fehler!
> 
> Es ist ein Unterschied ob man mit group by arbeitet oder nicht! Das sind dann 2 verschiedene paar Schuhe!
> 
> Er hingegen arbeitet ohne group by und deswegen ist es einfach komisch dass das PostGres nicht kann!



Sorry, das erste Statement habe ich falsch kopiert/editiert - hab es korrgiert.

Das Problem ist eigentlich das DISTINCT. Ich habe das mal eben getestet. Weder DB2 (5.2) noch Oracle (allerdings Version 8, Fehlermeldung: ORA-01791) können das (also ein DISTINCT mit einer Sortierung, welche nicht im SELECT-Teil vorkommt).

Das einfache Statement (zuerst leider falsch kopiert) sollte nur zeigen, dass es weder mit GROUP BY noch mit den LEFT OUTER JOIN's zu tun hat.

Da man mit Group by eine ähnliche Funktionalität wie DISCTINCT erreichen kann, habe ich den workaround damit gemacht.


----------



## thE_29 (26. Feb 2007)

Tjo, also ist eigentlich dieses DISTINCT an allem schuld 

Kann postgres nun aber bei einem normalen select nach Spalten sortieren die nicht im select sind?


----------



## robertpic71 (26. Feb 2007)

thE_29 hat gesagt.:
			
		

> Tjo, also ist eigentlich dieses DISTINCT an allem schuld



Genau - darum habe ich auch das Minimalbeispiel ohne JOIN's usw. gemacht.  Wenn ich das GROUP BY nicht fälschlerweise drinnen gelassen hätte, wäre das wohl schon beim ersten Posting klarer gewesen. 



			
				thE_29 hat gesagt.:
			
		

> Kann postgres nun aber bei einem normalen select nach Spalten sortieren die nicht im select sind?



Klar kann es das. 

Eigentlich hätte ich erwartet, dass die großen Datenbanken kein Probleme damit haben - aber es ist auch nicht so leicht, die (interne) Ergebnistabelle von DISTINCT und GROUP BY nach etwas zu sortieren, was nicht darin enthalten ist...



> Es ist ein Unterschied ob man mit group by arbeitet oder nicht! Das sind dann 2 verschiedene paar Schuhe!


Ich finde das DISTINCT und GROUP BY sehr dicht beieinander liegen. Man bekommt sogar die gleiche Fehlermeldung, wenn man im ORDER BY ein Feld angibt, welches nicht im SELECT vorkommt.


----------

