PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL INNER JOIN?


mapel110
2008-04-23, 13:52:41
Ich hab zwei Tabellen, die ich miteinander verbinden will.

Der Schnipsel hier funktioniert schon mal für die eine Tabelle.

"SELECT
xxxx,
yyyy(1),
zzzz,
FROM
aaaaaaa
WHERE
blablablabla
ORDER BY
date ASC");


Jetzt will ich das zusätzlich haben als Ausgabe:
cccc
Inhalt der Tabelle 2 (bbbbbb) ist unter anderem:
cccc, yyyy(2)

Soll der Zusatz dann etwa so aussehen?
INNER JOIN
bbbbbb
ON (yyyy(1) = yyyy(2))

Und zusätzlich selectiert will ich dann eben "cccc" aus der zweiten Tabelle haben:
"SELECT
xxxx,
yyyy(1),
zzzz,
cccc
...
...


Ist das so einfach?
Ich glaube nicht. Bei mir will das nämlich nicht ganz so.

/edit
Das scheints zu sein. Jedenfalls kriege ich keine Fehlermeldung.

"SELECT
blablabla
xxxx AS aaaa
FROM
bbbbbb
INNER JOIN
ccccccc
ON (yyyy(1) = yyyy(2))
WHERE
....
ORDER BY
date ASC

Kinman
2008-04-23, 15:06:42
Ja, das ist es eigentlich schon.

Ich mache aber eigentlich (zur Übersicht immer folgendes)


SELECT tbl1.a, tbl2.c FROM tabelle_1 AS tbl1 JOIN tabelle_2 AS tbl2 ON tbl1.a = tbl2.b

Gast
2008-04-24, 21:02:13
Also einmal ein paar grundsätzliche Tipps zum Datenbankdesign. Damit tut man sich bei SQL Statements viel leichter:

1.) Jede Tabelle bekommt einen Namen und zwar in der Einzahl z.B. Mitarbeiter, Abteilung, Firma.
2.) Jede Tabelle erhält als Primärschlüssel einen Autowert. Wenn etwas anderes auch eindeutig sein muss (z.B. Artikelname), dann erhält dieser einen eigenen Index. Dieser Autowert hat den Namen Tabellenname_ID also z.B. Mitarbeiter_ID, Abteilung_ID, Firma_ID.
3.) Jedes Datenfeld bekommt den namen Tabellenname_Datenname.
4.) Jeder Fremdschlüssel bekommt den Namen Tabellenname_Zieltabelle also z.B. Mitarbeiter_Abteilung ist der Verweis zur Tabelle Abteilung.

Hier ein Beispiel:
Mitarbeiter: Vorname, Nachname, Kurzzeichen
Abteilung: Name, Abteilungsleiter
Firma: Name, Chef

Die 3 Tabellen würden unter dem SQL Server so aussehen:

create table Mitarbeiter
(
Mitarbeiter_ID int identity(1,1),
Mitarbeiter_Vorname nvarchar(50) not null,
Mitarbeiter_Nachname nvarchar(50) not null,
Mitarbeiter_Kurzzeichen nvarchar(3)
)

create table Abteilung
(
Abteilung_ID int identity(1,1),
Abteilung_Name nvarchar(50) not null,
Abteilung_Abteilungsleiter int
)

create table Firma
(
Firma_ID int idenity(1,1),
Firma_Name nvarchar(50) not null,
Firma_Chef int
)

Primary Keys, Foreign Keys, Indizes etc. werden nachher eingefügt.

Ein join sieht dann so aus dann immer folgendem Schema:

Beispiel: Vorname, Nachname und Telefonnummern aller Mitarbeiter aus allen Einkaufsabteilungen bei Firmen, dessen Chef im Vornamen Rudi heißt (Zeilenumbrüche muss man entfernen):

select Mitarbeiter.Mitarbeiter_Vorname, Mitarbeiter.Mitarbeiter_Nachname, Mitarbeiter.Mitarbeiter_Telefonnummer

from Mitarbeiter as Mitarbeiter join Abteilung as Abteilung on Mitarbeiter.Mitarbeiter_Abteilung=Abteilung.Abteilung_ID
join Firma as Firma on Abteilung.Abteilung_Firma=Firma.Firma_ID
join Mitarbeiter as Chef on Firma.Firma_Chef=Chef.Mitarbeiter_ID

where Abteilung.Abteilung_Name='Einkauf'
and Chef.Mitarbeiter_Vorname='Rudi'

Du verjoinst immer die Tabelle mit dem Fremdschlüssel mit dem Primärschlüssel der anderen Tabelle. Wenn notwendig, dann vergibst du jeder Tabelle noch einen Namen (weil z.B. der Chef auch ein Mitarbeiter ist, hier aber die Rolle als Chef hat). Zum Schluss setzt du noch die notwendigen Filter drauf. Das Datenbanksystem sollte hier selbständig die Indizes so benutzen, dass die Filter immer vor dem joinen angewendet werden.

Achtung: Ein join liefert immer alle Werte der Kind Tabelle (z.B. Mitarbeiter) und setzt statt der Abteilungs_ID die Werte der Eltern Tabelle ein z.B.
Hansi Müller Einkauf
Franzi Müller Einkauf
Karli Müller Verkauf

In einem Access Bericht würde das so aussehen:

Einkauf:
Hansi Müller
Franzi Müller

Verkauf:
Karli Müller

Diese Ausgabe ist nicht geeignet, wenn man z.B. auch die Abteilung EDV dabei haben will, die derzeit nicht besetzt ist (oder wo die Mitarbeiter weggefiltert wurden.

Wenn man z.B. in Access einen Bericht über alle Abteilungen mit ihren Mitarbeitern über 50 machen will, dann wäre hier die Abteilungen, die keine Mitarbeiter über 50 haben nicht dabei. Ist ja klar, weil man dazu keinen Mitarbeiter Eintrag hat.

Mit einem left bzw. right join kann man dafür sorgen, dass mindestens eine Zeile da ist. Hier würde einfach ein Mitarbeiter Eintrag mit NULL Werten und nur der Abteilung eingefügt werden.

Die Ausgabe würde dann so aussehen:

Hansi Müller Einkauf
Franzi Müller Einkauf
Karli Müller Verkauf
NULL NULL EDV

Sieht nicht schön aus, aber ist die einzige Möglichkeit, weil die Ausgabe ja 2 Dimensional sein muss.

Wenn man das in einen Access Bericht stopft und gruppiert, erhält man folgendes:

Einkauf:
Hansi Müller
Franzi Müller

Verkauf:
Karli Müller

EDV:
NULL NULL

Man kann z.B. auch alle Abteilungen mit der Anzahl ihrer Mitarbeiter anzeigen lassen. Da sieht das wieder wunderbar aus:

Einkauf: 2
Verkauf: 2
EDV: 0