JOIN - dann doppelte Feldnamen ?

MySQL, PostgreSQL, SQLite
torsten.e
Posts: 10
Joined: 2006-02-28 17:33

JOIN - dann doppelte Feldnamen ?

Post by torsten.e » 2006-03-17 11:43

SELECT * FROM i_adressen JOIN i_tiere ON i_adressen.id = i_tiere.adr_id

Wenn ich so zwei Tabellen miteinander verknüpfe, erhalte ich zwar die richtigen Datensätze, aber da in beiden Tabellen ein Feld "id" besteht, wird in der Ergebnis-Tabelle "id" doppelt angezeigt.

1.
Wie erhalte ich das Ergebnis i_tiere.id, i_adressen.id ohne dass ich für jedes Feld einen Alias angeben muß.

2.
Was bedeutet eigentlich "inner" und "outer" beim JOIN ?

Danke

Torsten.E

lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57

Re: JOIN - dann doppelte Feldnamen ?

Post by lord_pinhead » 2006-03-17 12:35

Torsten.E wrote:SELECT * FROM i_adressen JOIN i_tiere ON i_adressen.id = i_tiere.adr_id

Wenn ich so zwei Tabellen miteinander verknüpfe, erhalte ich zwar die richtigen Datensätze, aber da in beiden Tabellen ein Feld "id" besteht, wird in der Ergebnis-Tabelle "id" doppelt angezeigt.

1.
Wie erhalte ich das Ergebnis i_tiere.id, i_adressen.id ohne dass ich für jedes Feld einen Alias angeben muß.
Auch wenn ich kein Datenbank spezi bin tippe ich da jetzt einfach mal auf

Code: Select all

SELECT tabelle1, tabelle2, tabelle3.......
FROM i_adressen INNER JOIN i_tiere
ON (i_adressen.id = i_tiere.adr_id)
Muss jetzt nicht stimmen, aber kannst ja mal in der mysql Konsole testen.
2.
Was bedeutet eigentlich "inner" und "outer" beim JOIN ?
Inner Join: Inner Join gibt nur die Datenreihen aus den Tabellen an, welche eine gemeinsame Übereinstimmung besitzten. Z.B.: Sie erhalten nur jene Produkte die einem Lieferanten auch zugeordnet sind.
Outer Join: Outer Join beinhalten auch Datenreihen die keine verwandten Daten in der anderen Tabelle besitzen. Bei der Verwendung von Outer Join bekommen Sie z. B. auch Lieferanten die (im Moment) keine Produkte an Sie liefern.

(aus einem Hertz Lehrbuch)

LEFT und RIGHT JOIN gibt glaub ich noch informationen an, aber wie gesagt, das letzte mal habe ich vor 3 Jahren an einer Datenbank rumgewerkelt mit abfragen, kann mich auch dick täuschen.

torsten.e
Posts: 10
Joined: 2006-02-28 17:33

Vorschlag klappt nicht

Post by torsten.e » 2006-03-17 12:49

Klappt leider nicht mit SELECT tabelle1, tabelle2 ...
müssen Felder sein.

Torsten.E

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: JOIN - dann doppelte Feldnamen ?

Post by isotopp » 2006-03-18 08:34

Torsten.E wrote:1.
Wie erhalte ich das Ergebnis i_tiere.id, i_adressen.id ohne dass ich für jedes Feld einen Alias angeben muß.
Gar nicht. Es ist präzise der Grund für die Erfindung von AS solche Uneindeutigkeiten auflösen zu können. SELECT * ist sowieso schlechter Stil und sollte in Code nicht verwendet werden.

Guter Stil ist es auch, für jede Tabelle einen Kurznamen zu haben, und alle Spalten einer Tabelle mit dem Kurznamen zu präfixen (außer, wenn sie Fremdschlüssel sind).

Das wäre dann also "t" für Tiere, mit einer t_id, und "a" für Adressen mit einer a_id. Wenn eine Adresse zu einem Tier gehört, und deswegen an jeder Adresse eine t_id gespeichert wird, dann wird das Feld dafür a.t_id benannt.

In einem Join hast Du so immer eindeutige Feldnamen.
2.
Was bedeutet eigentlich "inner" und "outer" beim JOIN ?
Ein Join zwischen zwei Tabellen t1, t2 ist das Kreuzprodukt beider Tabellen, d.h. es wird intern jede Zeile aus t1 mit jeder Zeile aus t2 kombiniert.

In einem Inner Join werden nun aus dieser Grundmenge diejenigen Kombinationen von ( t1.*, t2.* ) selektiert, für die die Joinbedingung wahr ist.

In einem Left Outer Join werden ebenfalls alle Kombinationen aus (t1.*, t2*) selektiert, für die die Joinbedingung wahr ist, und dazu kommen dann noch alle bisher noch fehlenden Zeilen aus t1.*, wobei hier die nicht vorhandenen t2.* Werte mit NULL aufgefüllt werden.

Daher ist in einem Inner Join auf der Bedingung t1.t1_id = t2.t1_id immer t1.t1_id = t2.t1_id und beide sind austauschbar zu gebrauchen (etwa: count(t1_id) ist definiert und gleich, egal ob man t1.t1_id oder t2.t1_id in der Zählung verwendet).

In einem Left Outer Join dagegen kann t2.t1_id NULL sein, während t1.t1_id definiert ist. Entsprechend macht es einen Unterschied, ob man count(t1.t1_id) oder count(t2.t1_id) abfragt (Count zählt NULL-Werte nicht mit (und daher ist es auch ein Unterschied, ob man count(*) oder count(spaltenname) bestimmt)).