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
JOIN - dann doppelte Feldnamen ?
-
- Posts: 774
- Joined: 2004-04-26 15:57
Re: JOIN - dann doppelte Feldnamen ?
Auch wenn ich kein Datenbank spezi bin tippe ich da jetzt einfach mal aufTorsten.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ß.
Code: Select all
SELECT tabelle1, tabelle2, tabelle3.......
FROM i_adressen INNER JOIN i_tiere
ON (i_adressen.id = i_tiere.adr_id)
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.2.
Was bedeutet eigentlich "inner" und "outer" beim JOIN ?
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.
Vorschlag klappt nicht
Klappt leider nicht mit SELECT tabelle1, tabelle2 ...
müssen Felder sein.
Torsten.E
müssen Felder sein.
Torsten.E
Re: JOIN - dann doppelte Feldnamen ?
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.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ß.
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.
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.2.
Was bedeutet eigentlich "inner" und "outer" beim JOIN ?
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)).