2017-03-25 2 views
0

Query1:requête de jointure - Si l'ordre de jointure de table change

select * from t1 inner join t2 on t1.id = t2.id 
        left join t4 on t2.id = t4.id 
        left join t3 on t2.id = t3.id 

Query2:

select * from t1 inner join t2 on t1.id = t2.id 
        left join t3 on t2.id = t3.id 
        left join t4 on t2.id = t4.id 

Résultat Query1 et Query2 sera même ou non?

+0

quel est votre problème? –

+0

S'il vous plaît revoir votre question – Len

+1

Vous obtiendrez les mêmes lignes. Mais vous n'avez pas spécifié de clause ORDER BY, le moteur peut donc ordonner ces lignes différemment. – Frazz

Répondre

0

Vous devez faire attention lorsque vous comparez des jointures avec différentes commandes join. Si les jointures sont toutes des jointures internes, l'ordre n'a pas d'importance. Vous exemples ont des jointures externes.

de jointure interne t1 t2 sur t1.id = t2.id gauche rejoindre t4 sur t2.id = t4.id gauche rejoindre t3 sur t2.id = t3.id

from t1 inner join 
    t2 
    on t1.id = t2.id left join 
    t3 
    on t2.id = t3.id left join 
    t4 
    on t2.id = t4.id 

Dans ce cas, les conditions pour les deux jointures sont indépendantes les unes des autres. Autrement dit, t3 et t4 sont seulement comparés à t2 qui se produit plus tôt. L'ordre des jointures ne va pas faire la différence dans le jeu de résultats.

Lorsque vous envisagez si le jeu de résultat est le même, vous devez considérer les points suivants (au moins):

  • Est-ce que des clés de jointure NULL?
  • Les colonnes sont-elles sélectionnées dans toutes les tables?
  • Y a-t-il des correspondances pour toutes les conditions de jointure?
  • Les jointures ont-elles changé de gauche à droite?
  • Y a-t-il des parenthèses dans la clause FROM?

Il peut y avoir des différences surprenantes (mais subtiles) pour les requêtes qui semblent très similaires.