2010-03-31 12 views
0

J'ai une question générale sur la façon dont le serveur SQL évalue la requête joins.The estComment SQL Server évalue les différentes jointures différentes?

SELECT * 
FROM TableA 
INNER JOIN TableB ON TableB.id = TableA.id 
LEFT JOIN TABLEC ON TABLEC.id = TABLEB.id 

Q1: Quels tableaux est la gauche join basée sur? Je sais que ce sera basé sur le TABLEC mais quel est l'autre? Est-ce le résultat de la première jointure interne ou du TABLEB spécifié dans la condition de jointure gauche?

Q2: "LEFT JOIN TableC SUR TABLEC.id = TABLEB.id" équivalent à "LEFT JOIN TableC SUR TABLEB.id = TABLEC.id"

Q3: La requête équivalente à celle qui suit? (avec TABLEB.id remplacé par TABLEA.id?)

SELECT * 
FROM TableA 
INNER JOIN TableB ON TableB.id = TableA.id 
LEFT JOIN TABLEC ON TABLEC.id = TABLEA.id 

Merci!

Répondre

2

Q1: Il est basé sur le résultat de la jointure interne, par conséquent il ne restera que LEFT JOIN avec les éléments qui sont dans la TableA et la TableB.

Q2: Oui

Q3: Oui, il est une conséquence de la question Q1.

1

SQL est un langage déclaratif. Lorsque vous déclarez "A JOIN B JOIN C", il n'y a pas d'ordre de jointure impliqué. Le résultat final doit correspondre aux critères requis, mais l'implémentation sous-jacente est libre de choisir n'importe quel ordre d'implémentation réel. À un niveau logique, l'opérateur interne JOIN est associative donc l'ordre n'a pas d'importance: «UN JOIN B JOIN C» est identique à «A JOIN C JOIN B» qui est identique à «B JOIN A JOIN C» et etc., etc.

+0

Mais votre explication semble dire le commutatif plutôt que l'associatif. – zsong

+0

@ziang: vous avez raison. Je devrais expliquer que A JOIN (B JOIN C) est le même que (A JOIN B) JOIN C en effet, où les parenthèses indiquent l'ordre d'évaluation, pas une sous-requête. –