2010-09-17 9 views
4

Je suis un peu nouveau à écrire sql et j'ai une question sur les jointures. Voici un exemple sélectionner:sql rejoindre la syntaxe

select bb.name from big_box bb, middle_box mb, little_box lb 
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb; 

Alors disons que je cherche les noms de toutes les grandes boîtes qui ont niché quelque part dans leur une petite boîte qui est vert. Si je comprends bien, la syntaxe ci-dessus est une autre façon d'obtenir les mêmes résultats que nous pourrions obtenir en utilisant le mot-clé 'join'. Questions: l'instruction de sélection ci-dessus est-elle efficace pour la tâche en cours? Sinon, quelle est la meilleure façon de le faire? Est-ce que l'affirmation sucre syntaxique pour une jointure ou est-ce qu'il fait quelque chose d'autre?

Si vous avez des liens vers tout bon matériel sur le sujet, je l'aurais lu avec plaisir, mais puisque je ne sais pas exactement ce que cette technique s'appelle, j'ai de la difficulté à googler.

Répondre

12

Vous utilisez la syntaxe de jointure implicite. Cela équivaut à utiliser le mot clé join mais il est une bonne idée d'éviter cette syntaxe complètement et utiliser à la place jointures explicites:

SELECT bb.name 
FROM big_box bb 
JOIN middle_box mb ON mb.parent_box = bb.id 
JOIN little_box lb ON lb.parent_box = mb.id 
WHERE lb.color = 'green' 

Vous avez été portés disparus, le nom de la colonne dans la condition de jointure. J'ai deviné que la colonne s'appelle id.

Ce type de requête devrait être efficace si les tables sont indexées correctement. En particulier, il doit y avoir des contraintes de clé étrangère sur les conditions de jointure et un index sur little_box.color.

Un problème avec votre requête est que s'il y a plusieurs boîtes vertes dans une seule boîte, vous obtiendrez des lignes en double retournées. Ces doublons peuvent être supprimés en ajoutant DISTINCT après SELECT.

+0

La syntaxe "implicite" est ANSI-89; le "explicite" est ANSI-92 –

+0

Réponse complète, merci pour les conseils. C'était bâclé pour laisser le bb.id (ou quelque chose). Ok question de suivi: puis-je spécifier des conditions à partir de l'une des tables de la clause where? ie: WHERE lb.color = 'green' et mb.color = 'red' –

+0

Aussi, en recherchant la jointure implicite, il y a des observations que la jointure implicite est "ancienne et obsolète" Est-ce une opinion consensuelle parmi les sages? –