Hoe voer ik een eenvoudige join uit op meerdere tabellen?

Ik heb wat ik zeker weet, is hier nogal een remediërende vraag, maar ik kan niet voor het leven van mij deze eenvoudige join krijgen om te werken.

Kort gezegd, ik heb 3 tabellen:

  • LEDEN (voornaam, achternaam),
  • MEMBER_TO_GROUP (member_id, group_id)
  • BETALINGEN (member_id, date, amount).

Ik wil alle betalingen ontvangen van leden in een specifieke groep. Door slechts twee van de tabellen te gebruiken, kan ik alle BETALINGEN van een specifieke groep vinden, zonder LID-informatie, of ik kan alle LID-informatie vinden zonder BETALINGSinformatie. Wanneer ik echter probeer de derde tabel toe te voegen, worden slechte gegevens geretourneerd (ik krijg bijvoorbeeld leden die niet in de groep staan). Dit is de standaardvraag die ik gebruik:

SELECT
    p.*,
    m.first_name,
    m.last_name
FROM
    members m,
    payments p,
    member_to_group mg
WHERE
    mg.group_id = 12
    AND mg.member_id = p.member_id
    AND m.member_id = p.member_id

Ik weet niet zeker waar de verbinding verbroken is, maar alle hulp wordt het meest gewaardeerd.

2
Maak er een gewoonte van om de ANSI join-syntaxis te gebruiken (zoals in het antwoord van galador). Het is gemakkelijker te lezen en benadrukt vaak uw logische fouten.
toegevoegd de auteur Nick Chammas, de bron
@Nick, dit is SQL89. Explicit JOIN is SQL92 ... :-)
toegevoegd de auteur gbn, de bron
Impliciete joins zoals hier gebruikt, zijn een SQL-antipatroon. Deze slechte syntaxis is in 1992 vervangen door iets wat gemakkelijker te lezen en te onderhouden is en veel minder waarschijnlijk door toevallige kruisverbindingen.
toegevoegd de auteur HLGEM, de bron

1 antwoord

Ik denk dat dit moet krijgen wat je wilt:

SELECT p.*,
       m.first_name,
       m.last_name
FROM payments p
INNER JOIN members m
  ON m.member_id = p.member_id
INNER JOIN member_to_group mg
  ON mg.member_id = m.member_id
WHERE mg.group_id = 12
2
toegevoegd