LEFT JOIN

ChristianN

Neuer Benutzer
Beiträge
3
Guten Morgen,
ich gebe auf, ich finde die Lösung nicht alleine.
Ich möchte eine Abfrage konstruieren, in der ich zwei Tabellen (tbl_dienstplan und tbl_mitarbeiter) verknüpfe.
Jeder Eintrag 1,2 oder 3 steht für einen Mitarbeiter 1-4, also LEFT JOIN.
Wie lautet die SQL Syntax, wenn ich den Diensplan zeigen möchte, allerdings die Zahlen in VD, HD und FZA ersetzt durch die Namen aus tbl_mitarbeiter ?
Kann ich das in einer Abfrage formulieren oder müssen drei Abfragen gebildet werden ?

Ich finde als Anfänger keine Syntax für eine Abfrage. Danke für Eure Hilfe....
Christian

tbl_dienstplan:

IDDatumVDHDFZA
11.2.2024123
22.2.2024321
33.1.2024123
44.1.2024321
tbl_mitarbeiter
IDName
1Meier
2Schultze
3Lehmann
3Müller
 
Werbung:
Code:
postgres=# create table mitarbeiter (id int primary key, name text);
CREATE TABLE
postgres=# copy mitarbeiter from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1    meier
>> 2    schultze
>> 3    lehmann
>> 4    müller
>> \.
COPY 4
postgres=# create table dienstplan(id int primary key, v int references mitarbeiter, h int references mitarbeiter, f int references mitarbeiter);
CREATE TABLE
postgres=# copy dienstplan from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1    1    2    3
>> 2    3    2    1
>> 3    1    2    3
>> 4    3    2    1
>> \.
COPY 4
postgres=# select d.id, v.name, h.name, f.name from dienstplan d left join mitarbeiter v on d.v=v.id left join mitarbeiter h on d.h=h.id left join mitarbeiter f on d.f=f.id; 
 id |  name   |   name   |  name   
----+---------+----------+---------
  1 | meier   | schultze | lehmann
  2 | lehmann | schultze | meier
  3 | meier   | schultze | lehmann
  4 | lehmann | schultze | meier
(4 rows)

postgres=#
 
Hallo akretschmer,

nachdem ich deine Antwort gelesen hatte, habe ich in PHP/MySQL umgewandelt. Natürlich bin ich auch dafür zu blöd, ich bekomme immer einen Syntax-Fehler. Hier meine umgewandelter SQL-Befehl:

$query = "SELECT 'Datum', 'VD', 'HD', 'FZA' FROM 'tbl_dienstplan'
LEFT JOIN 'tbl_mitarbeiter' ON 'tbl_dienstplan.VD' = 'tbl_mitarbeiter.ID'
LEFT JOIN 'tbl_mitarbeiter' ON 'tbl_dienstplan.HD' = 'tbl_mitarbeiter.ID'
LEFT JOIN 'tbl_mitarbeiter' ON 'tbl_dienstplan.FZA' = 'tbl_mitarbeiter.ID' ";

was mache ich falsch ???
 
was mache ich falsch?
Das würde die Fehlermeldung sagen, dafür sind sie da.
Ob man sie versteht oder nicht, es ist immer gut, sie bei Nachfragen mitzuposten.

"SELECT 'Datum', 'VD', 'HD', 'F...
Die einzelnen Hochkommata sehen nicht nach Backticks aus, wie mysql das gerne hätte. Vielleicht ist das nur ein Copy/Paste Fehler.
Man braucht aber auch gar keine, wenn man saubere Objektnamen hat, also lieber so:
"SELECT Datum, VD, HD, F...

Dann solltest Du am besten immer, selbst wenn Du nur eine einzige Tabelle in Deinem Select Statement nutzt, eine Table Alias einsetzen und den dann auch bei der Nennung der Spalten einsetzen (vgl mit der Postgres Variante, wo Aliase verwendet werden:
..FZA FROM tbl_dienstplan d
LEFT JOIN tbl_mitarbeiter m ON d.VD = m.ID...
Da Du die Tabelle mitarbeiter mehrfach joinst, kann das ganz ausschließlich nur dem Zweck dienen, sie als separate Mengen anzusprechen (sonst würdest Du sie nur 1x joinen). Für jeden Join einer Tabelle setzt Du also einen "knackigen" Alias ein, der so kurz und eindeutig wie möglich ist und vor allem eindeutig unter den verschiedenen Aliasen.

Wenn Du das hast und weiter Fehlermeldungen erscheinen, einfach versuchen zu verstehen, was sie bedeuten.
Wenn es nicht verständlich ist, die Abfrage und die Fehlermeldung hier posten.
 
was mache ich falsch ???
Leerzeichen vor Satzzeichen ist schon mal verpöhnt, mehrere Fragezeichen machen die Frage nicht fragender ...

Vergleich bitte
select d.id, v.name, h.name, f.name
mit
SELECT 'Datum', 'VD', 'HD', 'FZA'

Während ich von 4 Tabellen abfrage (Tabellen d, v, h und f) fragst Du so erst einmal nur eine ab.

Hier joine ich:
left join mitarbeiter v on d.v=v.id left join mitarbeiter h on d.h=h.id left join mitarbeiter f on d.f=f.id;
Vergleich zu Deinem Konstrukt:
LEFT JOIN 'tbl_mitarbeiter' ON 'tbl_dienstplan.VD' = 'tbl_mitarbeiter.ID'
LEFT JOIN 'tbl_mitarbeiter' ON 'tbl_dienstplan.HD' = 'tbl_mitarbeiter.ID'
LEFT JOIN 'tbl_mitarbeiter' ON 'tbl_dienstplan.FZA' = 'tbl_mitarbeiter.ID' ";

Du versucht dieselbe Tabelle 3 mal zu joinen mit 3 unterschiedlichen Join-Bedingungen - ich joine 3 unterschiedliche Tabellen mit 3 dafür passenden Join-Bedingungen.
 
Du joinst einfach tbl_mitarbeiter 3 mal statt ein mal und um das zu können brauchst du Aliase weil die Spaltennamen sonst nicht eindeutig sind. Im Select-Teil musst du dir die Spalte Name dann drei mal aus drei verschiedenen Tabellennamen holen die aber alle der Tabelle tbl_mitarbeiter entsprechen.
 
Werbung:
Moin,

ich hab's geschaft ! Nachdem ich das Problem verstanden hatte, habe ich lange mit der Syntax gekämpft.

SELECT
tbl_dienstplan.Datum,
tbl_a.Name,
tbl_b.Name,
tbl_c.Name
FROM tbl_dienstplan
LEFT OUTER JOIN tbl_mitarbeiter tbl_a
ON tbl_dienstplan.VD = tbl_a.ID
LEFT OUTER JOIN tbl_mitarbeiter tbl_b
ON tbl_dienstplan.HD = tbl_b.ID
LEFT OUTER JOIN tbl_mitarbeiter tbl_c
ON tbl_dienstplan.FZA = tbl_c.ID

dank an Alle, dass ihr meine Gedanken in die richtige Richtung geschubst habt....
 
Zurück
Oben