+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Union All ohne Sortierung

  1. #1
    m.sirin ist offline Neuer Benutzer
    Registriert seit
    19.09.2009
    Beiträge
    6

    Standard Union All ohne Sortierung

    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:

    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
    
    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:
    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 18:41 Uhr)

  2. #2
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    220

    Standard

    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?'

  3. #3
    m.sirin ist offline Neuer Benutzer
    Registriert seit
    19.09.2009
    Beiträge
    6

    Standard

    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 19:12 Uhr)

  4. #4
    ads
    ads ist offline Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    3.405

    Standard

    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

  5. #5
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.473

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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.)
    Das gilt aber erst ab 8.2, oder?

    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    ads
    ads ist offline Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    3.405

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Das gilt aber erst ab 8.2, oder?
    Ja. Das sollte nur verdeutlichen, dass es keinen "Rohzustand" gibt, wenn man keine Sortierung angibt.
    Auch vor 8.2 kamen die Daten nach einer Änderung an einem Datensatz in einer veränderten Reihenfolge aus der DB. Da gab es halt nur keine parallelen Scans.
    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

  7. #7
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.473

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Ja. Das sollte nur verdeutlichen, dass es keinen "Rohzustand" gibt, wenn man keine Sortierung angibt.
    Auch vor 8.2 kamen die Daten nach einer Änderung an einem Datensatz in einer veränderten Reihenfolge aus der DB. Da gab es halt nur keine parallelen Scans.
    Das ist korrekt. Und ab 8.2 kann das sogar bei nicht geänderten Tabellen passieren, also *noch* *viel* *schlimmer*.

    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  8. #8
    m.sirin ist offline Neuer Benutzer
    Registriert seit
    19.09.2009
    Beiträge
    6

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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.
    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.

  9. #9
    ads
    ads ist offline Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    3.405

    Standard

    Zitat Zitat von m.sirin Beitrag anzeigen
    Das relevanteste Ergebnis zum Suchstring soll möglichst weit oben erscheinen.
    Du willst Volltextsuche! Ganz sicher.
    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

  10. #10
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.473

    Standard

    Zitat Zitat von m.sirin Beitrag anzeigen
    okay

    ich will doch nur, dass die Ergebnisse der ersten Subquery über dem Ergebnis der zweiten Subquery erscheinen.
    Dann selektiere in der ersten Subquery eine extra Spalte mit dem Wert 1 und in der zweiten Subquery in dieser Spalte 2. Nach dieser Spalte sortierst Du dann, fertisch...


    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

+ Antworten
Seite 1 von 2 1 2 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum