Frage zu Unions

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Ich würde heute gerne noch fragen, was es mit Union überhaupt auf sich hat?

Mir ist bewusst, dass Union irgendeine Art ist um mehrere Tabellen miteinander zu verbinden, habe jedoch keine Ahnung, was Union im absoluten tut.

Ich kenne die Verbindung zwischen Tabellen jetzt schon mittels Foreign Keys (Abhängigkeit), und aber auch bei Selects mittels Joins.
Ich denke, union wird etwas ähnliches sein wie Joins(?), sprich nicht in die Datenbank programmierbar, sondern nur bei einzelnt abfragbaren Querys.

Bin natürlich, wie immer, sehr dankbar, wenn ich heute Abend nach meiner World of Warcraft Runde eine Erklärung, womöglich auch passende Links zur PostgreSQL-Doku, und natürlich ein Beispiel habe ;)

Und, damit ich es nicht vergesse:
Denkt ihr, ich könnte ein relativ einfaches, natürlich sich steigerndes, umfangreiches Tutorial über SQL machen?
Ich denke, der Meinung zu sein, etwas perfekt können zu müssen, um mich vor peinlichen Fehlern, oder etwa Gelächter zu schützen, aber irgendwann muss ich das Thema auch überwinden ;)

Habe, um ehrlich zu sein, im Hinterkopf auch vor, einen Fragebogen in PostgreSQL zu gestalten, was mir relativ einfach erscheint, wenn ich ehrlich sein darf, aber irgendwie auch noch nicht entstanden ist. (Eine Tabelle Fragen (ID Serial Primary Key, Frage text), eine Tabelle Antworten (ID Serial Primary Key, Frage integer references Fragen(id), Antwort text), und die zwei einfach hübsch quer durcheinander selecten, und schon wäre das Ganze fertig ;)

Wenn ich diese 2 Punkte kombiniere, könnte ich ja gleich Lehrer werden, lol
 
Werbung:
Allllso:

Code:
test=# select * from generate_series(1,10) s union all select * from generate_series(5,15) t;
 s  
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
(21 Zeilen)

UNION ALL verbindet alles zusammen, inklusive doppelter Zeilen (5-10). Aber es gibt auch:

Code:
test=*# select * from generate_series(1,10) s union  select * from generate_series(5,15) t;
 s  
----
 10
 15
  8
  6
  7
 11
 12
  2
 13
  5
  4
  1
  3
 14
  9
(15 Zeilen)

hier bekommst nur die Unikate. Der Preis: es ist unsortiert. Warum auch nicht, Du hast kein ORDER BY genannt.

Code:
test=*# select * from generate_series(1,10) s union  select * from generate_series(5,15) t order by s;
 s  
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
(15 Zeilen)

test=*#

Merke:

  • UNION ohne ALL liefert nur unikate Rows
  • mit ALL kommen alle Rows
  • beide Tabellen müssen gleich aufgebaut sein (gleiche Anzahl Spalten, gleichen Typen)
  • UNION ohne ALL ist unsortiert (einträge aus beiden Tabellen vermischt), solange Du es nicht expliziet verlangst

Grund für den letzten Punkt ist übrigens, daß PG das intern via Hashes regelt und die Sortierung nicht macht, wenn nicht verlangt. Optimierung halt. Generell: ohne ORDER BY kann IMMER das Result unsortiert sein. NIEMALS NIE auf eine impliziete Sortierung verlassen.
 
Wie soll ich das mit impliziete Sortierung verstehen?
Wenn ich nachdenke (und ein wenig nach wörterbuch implizit google), wäre das eine Sortierung nach einer Spalte, die ich garnicht selecte?

EDIT: Anbei würde mich auch interessieren, wo man das im effektivem in einem Betrieb brauchen könnte?

Oder kann man auf beiden Seiten auch Joins selecten, und damit wiederum mehrere Spalten selecten, wobei die nur mittels einer ID miteinander verknüpft sind (Foreign Key)?
 
Zuletzt bearbeitet:
Datenbanken arbeiten mengenorientiert. Ein Haufen Sand ist auch eine Menge, die Körner nicht nach Größe, Farbe oder Gewicht sortiert.

Ein UNION liefert per Definition (SQL-Spec) eine unikate Menge aus den beteiligten Tabellen, doppelte Einträge darf/soll es da nicht geben. Um das zu erreichen, wird sortiert. Das erfolgt allerdings nach einem Hash-Verfahren, daher 'fallen' die Rows da eher unsortiert raus.
 
Kaum schaut man in der Doku nach, wird einem das Ganze deutlich klarer :D

Union, Intersect und Except sind unter dem Punkt "Combining Querys" aufgeführt, und mit Except Querys habe ich mich ja schon auseinandergesetzt ;)

Warum ich hier keinen Link der Doku reinstelle? Damit ich mich nicht wieder schimpfen lasse, "Die Doku ist alt, unterlass also bitte sowas", oder so.

Was eine Intersect Combining-Query machen würde, weiß ich noch nicht, aber ich denke (hoffe), dass mich jemand *den Elephanten anstups* über das Thema dementsprechend und angemessen aufklärt.
 
Werbung:
Zurück
Oben