2.9k Aufrufe
Gefragt in Datenbanken von
Hi Leute,

Vielleicht kann mir jemand helfen. Und zwar muss ich für die Schule
eine Abfrage über drei Tabellen machen. Als Beispiel:

Tabelle Spieler
s_id
name

Tabelle Mannschaft
m_id
vollername

Tabelle Mannschaft_has_Spieler
m_id
s_id

Folgendes möchte ich: Alle Spieler einer Mannschaft anzeigen

Wie würde die SQL Abfrage genau aussehen?


Habe mal so begonnen:
select vollername, name
from mannschaft, spieler
where ...


Vielen Dank schon im voraus und allen einen schönen Sonntag

Grüsse,mj

2 Antworten

0 Punkte
Beantwortet von marie Experte (2k Punkte)
Also wenn Du eine kreuztabelle willst, dann musst Du schon sagen was die aussagen soll. Wenn Du eine Abfrage willst mit allen Spielernamen einer Mannschaft, dann ist es keine Kreuztabellenabfrage, dann muss es aber doch ohnehin eine feste Beziehung geben zwischen der Tabelle Spieler und der Tabelle Mannschaft. Also jeder Spieler muss doch einer Mannschaft zugeordnet sein. Und diese Beziehung hast Du in "Beziehungen" festgelegt und dadurch erscheint sie automatisch in jeder Abfrage, wenn Du beide Tabellen in der Entwurfsansicht hinzufügst.

Dann kannst Du doch einfach die Abfrage im Entwurfsmodus erstellen, indem Du beide Tabellen hinzufügst und die felder anklickst die Du brauchst. Wenn deine Tabelle das anzeigt was Du haben möchtest, dann gehst Du in Ansicht SQL und kopierst Dir den Code raus.

der sieht dann so ähnlich automatisch aus:

SELECT DISTINCTROW Tabelle_Spieler.s_id, Tabelle_Mannschaft.Zuname, Tabelle_Mannschaft.Vorname
FROM Tabelle_Mannschaft RIGHT JOIN Tabelle_Spieler ON Tabelle_Mannschaft.m_id = Tabelle_Spieler.m_id;


Gruß Marie
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo mastermj,

falls du mit der "Kreuztabelle" deine Intersection-table "Manschaft_has_spieler" meinst, dann würde eine funktionierende SQL-Abfrage so aussehen:
SELECT spieler.Name, mannschaft.vollername
FROM (spieler INNER JOIN mannschaft_has_spieler ON spieler.s_id = mannschaft_has_spieler.s_id) INNER JOIN mannschaft ON mannschaft_has_spieler.m_id = mannschaft.m_id;

Mit unten aufgeführen Werten ergibt das:
Name vollername
Hans A
Paul B
Peter A
Peter C

Falls du aber wirklich eine Kreuztabelle (bzw. pivot-table) meinst, dann sieht eine Abfrage mit den Daten

Spieler:
s_id Name
1 Hans
2 Peter
3 Paul

und Manschaft:
m_id vollername
1 A
2 B
3 C

und der Zurdnung Mannschaft_has_spieler:
ID m_id s_id
1 1 1
2 1 2
3 2 3
4 3 2

so aus:
TRANSFORM Min(mannschaft_has_spieler.ID) AS MinvonID
SELECT spieler.Name
FROM (spieler INNER JOIN mannschaft_has_spieler ON spieler.s_id = mannschaft_has_spieler.s_id) INNER JOIN mannschaft ON mannschaft_has_spieler.m_id = mannschaft.m_id
GROUP BY spieler.Name
PIVOT mannschaft.vollername;
und liefert als Ergebnis:
Name A B C
Hans..1
Paul.......3
Peter..2.....4

(Punkte bitte weg denken)
Da du aber in der Intersection-Table, keine weitere Werte hast für die Kreuztabelle (ich zeige die ID an), gehe ich vom ersten Fall aus.
Gib' mal ein Feedback.

Gruß
Ralf
...