Hi,
habe hier eine SQL-Abfrage, die mich gerne ärgert und über mich lacht. Das zurückgegebene Ergebnis der Abfrage sortiert sich einfach von selbst, was es aber nicht tun soll:
Eine Sortierung ist aber nicht gewünscht. Ergebnis der ersten Unterabfrage mit ..ILIKE 'hallo%' soll einfach nur mit dem Ergebnis der zweiten Unterabfrage vereint werden, sodass das die Ausgabe bspw. so aussieht:Code:select distinct * from (SELECT name,gemeinde, astext(referenz_900913) as punkt,astext(extent_900913) as extent,astext(geom_900913) as geom FROM gc_berechnet WHERE name ILIKE 'hallo%' UNION ALL (SELECT name,gemeinde, astext(referenz_900913) as punkt, astext(extent_900913) as extent,astext(geom_900913) as geom FROM gc_berechnet WHERE name ILIKE '%$hallo%'))a
hallo1
hallo3
ahallo
bhallo
und nicht
ahallo
bhallo
hallo1
hallo3
Wie kann ich das am besten realisieren ?
(Ich dachte, UNION ALL vernachlässige Sortierung, was es aber hier nicht der Fall ist.)
Besten Dank schon mal!!
Grüße
m.sirin
//EDIT: liegt wohl an dem Distinct.. sobald es draußen ist, gibt es keine Sortierung, dafür aber doppelte Einträg.Auch nicht gut..
Geändert von m.sirin (01.02.2010 um 19:41 Uhr)
UNION vs. UNION ALL hat nichts mit Sortierung zu tun. UNION entfernt einfach Duplikate aus dem Ergebnis währen UNION ALL das nicht tut.
In älteren Postgres Versionen wurde das Entfernen der Duplikate auch mal über sortieren gemacht (war aber ein Nebeneffekt) bei neueren Versionen geht das auch ohne Sortieren.
Ansonsten gilt: solange Du kein ORDER BY verwendest ist es der Datenbank freigestellt in welcher Reihenfolge die Datensätze zurückkommen!
Wenn Du eine bestimmte Reihenfolge erzwingen willst dann musst Du ORDER BY verwenden. Wenn Du das nicht verwendest darfst/kannst Du Dich auch nicht über die Reihenfolge beschweren.
Ohne ORDER BY darf die Reihenfolge auch bei jeder Abfrage anders sein. Hänge also ein ORDER BY an, und schon klappt das.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
Genau die Nichtsortierung wollte ich ja auch haben, also den Rohzustand, wie ihn mir Postgres zurückliefert und nichts mit order by.Okay, dann liegt es also nicht an union all, gut.
. Oh, soeben bemerke ich, dass durch das distinct wohl ein automatisches Order By Asc erzwungen wird..
Kann man die Sortierung des Distincts nicht abschalten^^ ?
Geändert von m.sirin (01.02.2010 um 20:12 Uhr)
Es gibt keinen "Rohzustand"!
Selbst wenn du die gleiche Tabelle mit verschiedenen Verbindungen liest, kann es passieren, dass du eine unterschiedliche Reihenfolge bekommst. Das liegt daran, dass sich alle weiteren Anfragen auf die erste Aufschalten und ab dem aktuellen Punkt "mitlesen". Wenn die ersten Anfrage fertig ist, fangen die anderen von vorne an und arbeiten bloß noch das fehlende Stück ab. (Der Effekt wirkt sich aber erst ab größeren Tabellen aus.)
Du hast also nie eine voraussagbare Sortierung und wie castorp schon sagt: wenn du nichts verlangst, darfst du dich über das Ergebnis auch nicht beschweren.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
okay
ich will doch nur, dass die Ergebnisse der ersten Subquery über dem Ergebnis der zweiten Subquery erscheinen.
Notfalls ist meine 1.Subquery so : ... name='hallo'; d.h. es gibt nur eine Zeile als Rückgabe.
Diese Rückgabe soll mit dem anderen Ergebnis unioniert werden, und dabei Ergebnisse nur einmal vorkommen lassen. Und das ist nicht möglich?
Oder mit anderen Worten: Das relevanteste Ergebnis zum Suchstring soll möglichst weit oben erscheinen.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen