# SQL in 2 Tabellen abfragen



## js-mueller (12. Mai 2006)

Hi

ich habe 2 tabellen. Und zwar einmal die tabelle berichte und einmal die Tabelle kategorie.
Jetzt gibt es in der tabelle Berichte eine Spalte kidn. Dort ist ein Int gespeichert welcher die Kategorie angibt. Nun möchte ich anhand der Zahl den namen der Kategorie aus der Tabelle kategorie auslesen.
Sprich:

berichte.kidn -> kategorie.idn = kategorie.name

Kann mir da wer helfen?


----------



## magnificent (12. Mai 2006)

Hallo,
müßte eigentlich so aussehen:

Select name from kategorie, berichte where kategorie.idn = berichte.kidn

Mfg

Edit: oder mit nem Join:

SELECT name
FROM        kategorie INNER JOIN
                 berichte ON kategorie.idn=berichte.kidn
where kategorie.idn=berichte.kidn

gegebenfalls noch ein Group By einbauen


----------



## js-mueller (12. Mai 2006)

Ahso sorry ich hab noch vergessen zu sagen das ich den rest aus der Tabelle berichte auch noch ausgelesen haben möchte (thema, bericht,datum)


----------



## magnificent (12. Mai 2006)

Select kategorie.name, berichte.* from kategorie, berichte where kategorie.idn = berichte.kidn


----------



## js-mueller (13. Mai 2006)

Hi, danke das funktioniert super, aber ich hab paar verständniss fragen dazu, damit ichs nächstes mal alleine hinbekomme.

1. Also wieso brauch ich dafür kein JOIN? In meinem Buch hatte ich gelesen das man für 2 Tabellen nen JOIN brauch.
2. where kategorie.idn=berichte.kidn; Er ließt aus der berichte Tabelle alles aus, weil sich WHERE nur auf die kategorie Tabelle bezieht oder? Mit nem AND könnt ich noch einschränkungen bei berichte machen oder?

Danke schonma für die schnellen antworten gestern.


----------



## magnificent (15. Mai 2006)

Sry, mußt meinen Rechner am Wochenende plätten und dann alles wieder neu drauf hauen...

Kleine Erklärung zu 2:
_Select kategorie.name, berichte.*_ selektiere alle Spalten (wegen dem *) der Tabelle 'berichte' und die Spalte 'name' der Tabelle 'kategorie'

_from kategorie, berichte_ von den Tabellen 'kategorie' und 'berichte' -- wird auch für die where klausel benötigt

_ where kategorie.idn = berichte.kidn_ führe den angegebenen Select aus wo/wenn der Wert der Spalte 'idn' der Tabelle 'kategorie' = (gleich)  dem Wert der Spalte 'kidn' der Tabelle 'berichte' ist.
Mit einem AND könntest du weitere Beschränkungen vornehmen.


Zu 1:
Also mit nem JOIN geht es auch, aber da es sich hier nur um 2 Tabellen und einer relativ einfache Bedingung handelt ist die andere Form auch möglich, weil überschaubar.

Ich hab einige Abfragen die sich durch 4-5 Tabellen mit je unterschiedlichen Bedingungen hangeln, da ist ein JOIN unumgänglich!


Wenn noch was offen is, dann einfach fragen.
Mfg


----------



## BeaTBoxX (15. Mai 2006)

Ich war immer der Meinung, dass es sich in beiden Faellen um nen Join handelt.  Das ist doch nur Kosmetik ob man die Abfrage mit


SELECT  ..FROM 
tabelle1 JOIN tablelle2
ON tabelle1.irgendwas = tabelle2.irgendwas

oder mit

SELECT .... FROM
tabelle1,tabelle2 
WHERE tabelle1.irgendwas = tabelle2.irgendwas


macht.

Oder liege ich falsch?
Das Ergebnis ist das gleiche.

Gruß
Frank

PS:  Natuerlich nur, wenn man nicht Formulierungen wie left outer join usw braucht !


----------



## magnificent (15. Mai 2006)

Japp, ansich sind beides Joins, nur bei dem einen wird es nicht extra geschrieben (, weil halt auf INNER, OUTER, LEFT verzichtet wird)...

join = verbindung


----------



## PeterE (16. Mai 2006)

Hallo,

nachteil der Abfrage ist, man bekommt nur Datensätze angezeigt zu denen auch Kategorienamen vorhanden sind. So würden z.B. Fehlende Kategorienamen nicht auffallen. Ich würde ein LEFT OUTER JOIN nutzen. Solang alle Kategorienamen vorhanden sind ist das Ergebnis identisch, fehlende Fallen dann aber sofort auf. 

Gruß

PeterE


----------

