2010-08-10 8 views
1

J'ai quelques tables:de base SQL requête de jointure

event_type (et), événement (e), event_booking (eb), personne (p), person_address (p) et address_country (ac)

ils sont rejoints comme ceci:

et < - e <-eb ->p ->Chaque jointure a une relation un à un, à l'exception du lien eb ->p. Une ligne dans eb peut avoir un null au lieu d'un ID de p.

Je souhaite obtenir toutes les réservations, qu'il y ait ou non une ligne correspondante dans p.

Donc, une simple jointure à gauche.

mais qui serait mieux? (Ou est-il une meilleure façon?)

et J e J eb LJ p LJ pa LJ ac (je suppose que ce serait traité de manière identique à ac J pa J p RJ eb RJ e RJ et?)

ou

et J e J eb LJ (p J pa J ac) (c.-à-gauche se joindre à un sous-select)

Répondre

1

J'utilise généralement la syntaxe suivante - qui correspond en quelque sorte à votre deuxième scénario

select 
    * 
from 
    eb 
    inner join e on eb.eId = e.eId 
    inner join et on e.etId = et.etId 
    left join p 
      inner join pa on p.paId = pa.paId 
      inner join ac on pa.acId = ac.acId 
     on eb.pId = p.pId 

Je ne suis pas sûr des conséquences sur les performances, mais je ne serais pas surpris si les deux scénarios ont généré le même plan de requête

+0

Merci Kristof, je pense que ce sera idéal. Une syntaxe étrange que je n'ai pas vraiment utilisée auparavant! – aidan

1

Il suffit de tester vos requêtes en utilisant EXPLAIN, il montrera si et comment les clés sont utilisées.

Questions connexes