SQL Where Abfrage geht nicht

Hallo Zusammen

folgendes Problem:

Die Datenbank enthält 2 Tabellen. Eine Mitglieder und eine HelferPlanung.
Mitglieder enthält
Name
Mail

HelferPlanung enthält
Rennleiter1
Zeitnehmer1
ZBV

Das Feld Rennleiter1 wird befüllt über ein Auswahlfeld, dessen Auswahlgrundlage die Tabelle Mitglieder und die Spalte Name ist.

Am ende möchte ich eine Mail an alle Helfer senden, wo die Einteilung enthalten ist.

Dazu benötige ich also die Mailadresse, der Personen die eingeteilt sind, also werte aus Mitglieder.Name die Gleich sind zu Helferplanung.Rennleiter1 oder Helferplanung.Zeitnahme1.

folgende Abfrage habe ich nur für den ersten Wert

SELECT Mail from Mitglieder Where Mitglieder.Name = HelferPlanung.Rennleiter1

Hierbei bekomme ich aber schon die Fehlermeldung:
Unknown column ‚HelferPlanung.Rennleiter1‘ in ‚where clause‘
SELECT Mail from Mitglieder Where Mitglieder.Name = HelferPlanung.Rennleiter1

Da also die Erstversion schon nicht geht habe ich die weiteren Abfrageelemente nicht eingefügt.

Jetzt weiß ich aber nicht wo der Fehler liegt

gruß martin

In dem FROM-Teil des SQL-Selects müssen alle beteiligten Tabellen aufgeführt werden:

SELECT Mitglieder.Mail
FROM Mitglieder, HelferPlanung
WHERE Mitglieder.Name = HelferPlanung.Rennleiter1

Hallo Martin,

versuch’s mal mit

SELECT Mail
FROM Mitglieder, HelferPlanung
WHERE Mitglieder.Name = HelferPlanung.Rennleiter1
OR Mitglieder.Name = HelferPlanung.Zeitnahme1

Du musst in einem SELECT-Statement immer die beteiligten Tabellen in der FROM-Klausel nennen, damit der Befehl auch tatsächlich ausgeführt werden kann.

Grüße
Michael

Hallo Martin,

wenn du eine Abfrage über mehrer Tabellen machst, dann musst du diese Tabellen mit einem sog. „join“ verknüpfen. Bei diesem join musst du dann die Spalten angeben, die miteinander verknüpft sind.

SELECT distinct Mail
from Mitglieder
inner join HelferPlanung
on HelferPlanung.Rennleiter1 = Mitglieder.Name

Erklärung:

  • distinct: jede „Mail“ kommt nur einmal im Ergebnis auch wenn eine Person mehrmals als Rennleiter eingetragen wurde

  • inner join: verknüpft die Tabelle Mitglieder mit HelferPlanung

  • on: hier wird festgelegt, welche Spalten der beiden verknüpften Tabellen die „selben“ Daten enthalten

  • where: brauchst du hier nicht, es werden alle Daten selectiert, du kannst dort aber alle Spalten der beiden verknüpften Tabellen benutzen

  • „inner join“ oder „left join“: inner join selectiert nur Daten bei denen eine Verknüpfung besteht. Gibt es z.b. den Namen „Martin“ in Mitglieder.Name, aber nicht in HelferPlanung.Rennleiter1, dann kommt der Datensatz nicht im Ergebnis. Bei left join würde er schon kommen, wobei dann aber im Ergebnis HelferPlanung.Rennleiter1 leer ist. Spiel einfach mal ein bisschen damit rum und schau dir die Ergebnisse dann dann steigst du da sicher schnell durch.

Hoffe das klappt und ich konnte dir weiterhelfen. Falls es trotzdem noch Probleme gibt dann scheib nochmal.

Grüße, Christian

Hallo Martin,

in der FROM-Clause müssen alle angesprochenen Tabellen aufgeführt werden.
In Deinem Beispiel also:

SELECT Mail from Mitglieder, HelferPlanung Where Mitglieder.Name = HelferPlanung.Rennleiter1

Gruß
Erhard

Die Datenbank enthält 2 Tabellen. Eine Mitglieder und eine
HelferPlanung.
Mitglieder enthält
Name
Mail

HelferPlanung enthält
Rennleiter1
Zeitnehmer1
ZBV

SELECT Mail from Mitglieder Where Mitglieder.Name =
HelferPlanung.Rennleiter1

Hierbei bekomme ich aber schon die Fehlermeldung:
Unknown column ‚HelferPlanung.Rennleiter1‘ in ‚where clause‘
SELECT Mail from Mitglieder Where Mitglieder.Name =
HelferPlanung.Rennleiter1

Da also die Erstversion schon nicht geht habe ich die weiteren
Abfrageelemente nicht eingefügt.

Jetzt weiß ich aber nicht wo der Fehler liegt

gruß martin

SELECT Mitglieder.Name, HelferPlanung.Rennleiter1, …
FROM Miglieder, HelferPlanung
WHERE Mitglieder.Name = HelferPlanung.Rennleiter1
OR Mitglieder.Name = Helferplanung.Zeitnahme1

Dieser SELECT sollte funktionieren, aber Deine Anforderung nicht erfüllen

Gruss
jak43

Mein Vorschlag:
arbeite mit 3 Tabellen

  • Miglieder (ID, Name, Mailadr, etc)
  • Funktionen (ID, Funktion)
  • Anlaesse (Anlass, Mitglied, Funktion)

mit dem folgenden SQL

SELECT Mitglieder.Name, Funktionen.Art, Mitglieder.Mail
FROM Mitglieder, Funktionen, Anlaesse
WHERE Anlaesse.Anlass = „Rennen 10“
AND Anlaesse.Mitglied = Mitglieder.ID
AND Anlaesse.Funktion = Funktionen.ID

weniger schöne Lösung, falls ein Mitglied mehr als eine Funktion ausübt.

Moin, moin!

du hast in der FROM Klausel die Tabelle HelferPlanung nicht angegeben.
Damit aus dieser Abfrage etwas sinnvolles heraus kommt, muessen die Tabellen in einer Beziehung zueinander stehen und mit einem „JOIN“ verknüpft werden:
FROM Mitglieder
INNER JOIN HelferPlanung ON HelferPlaung. = Mitglieder.

Dabei statt jeweils den Namen einer Spalte angeben, die in beiden Tabellen den gleichen Wert enthält.

Wenn Du mal INNER JOIN in Google eingibst, wirst Du reichlich Infos finden.

Ingo

Die zweite Tabelle „HelferPlanung“ fehlt hinter „from“. Dort müssen alle Tabellen stehen, auf die in der Abfrage zugegriffen wird.

Korrekt wäre

SELECT Mail
from Mitglieder, HelferPlanung
Where Mitglieder.Name = HelferPlanung.Rennleiter1

Moin Martin,

Du hast einfach nur die HelferPlanung in der FROM-Klausel vergessen.

Korrektes SQL (Full Join):
SELECT Mitglieder.Mail
FROM Mitglieder, HelferPlanung
WHERE Mitglieder.Name = HelferPlanung.Rennleiter1;

oder mit alias:
SELECT m.Mail
FROM Mitglieder m,
HelferPlanung hp
WHERE m.Name = hp.Rennleiter1;

Gruß Berthold

Hallo,

Wenn nur die Mailadressen derjenigen Leute gesucht sind, die
in HelferPlanung mindestens einmal als Rennleiter auftauchen,
dann wäre eine Subanfrage aus meiner Sicht am praktischsten:

SELECT Mail from Mitglieder Where Mitglieder.Name in
(select HelferPlanung.Rennleiter1 from HelferPlanung)

Soll jeder Eintrag aus HelferPlanung auch im Ergebnis auftauchen
(ggf. auch mehrmals derselbe Rennleiter, wenn er mehrfach in
HelferPlanung auftaucht), dann braucht man eine so genannte
Verbund- oder Join-Anfrage. Dabei müssen alle beteiligten
Tabellen in der FROM-Klausel vorkommen, also z.B.

SELECT Mitglieder.Mail
FROM Mitglieder, HelferPlanung
WHERE Mitglieder.Name = HelferPlanung.Rennleiter1

Diese Variante hat den Vorteil, dass man sie einfach in
der SELECT-Klausel um zusätzliche Spalten aus beiden
beteiligten Tabellen erweitern kann, z.B.:
SELECT Mitglieder.Mail, HelferPlanung.Rennleiter1, HelferPlanung.Zeitnehmer1

Im obigen Beispiel würde man als Ergebnis für jeden Eintrag in HelferPlanung
den Namen des Rennleiters, den Namen des Zeitnehmers und die Mailadresse
des Rennleiters sehen.

Möchte man für jeden Beteiligten die Mailadresse sehen, dann muss
man in der FROM-Klausel die Tabelle mit den Mailadressen mehrfach
angeben und mit einem Aliasnamen versehen. Das sähe dann so aus:

SELECT rennleiter.Mail, zeitnehmer.Mail, zbv.Mail
FROM HelferPlanung p, Mitglieder rennleiter, Mitglieder zeitnehmer, Mitglieder zbv
WHERE p.Rennleiter1 = rennleiter.Name
AND p.Zeitnehmer1 = zeitnehmer.Name
AND p.zbv = zbv.Name

Ich hoffe, es ist etwas nützliches dabei :wink:.

Mit freundlichen Grüßen

Michael