2009-07-29 5 views
4

Ce que je veux dire, si je devais le schéma suivant:« sauter » une table interne SQL rejoint

create table tableA(
    A_id number not null primary key 
); 

create table tableB(
    B_id number not null primary key, 
    A_id number not null references tableA(A_id), 
    B_data text not null 
); 

create table tableC(
    C_id number not null primary key, 
    A_id number not null references tableA(A_id), 
    C_data text not null 
); 

Si je voulais récupérer B_data et C_data en utilisant les relations décrites ici, est-il une différence entre les éléments suivants:

select 
    b.B_data, 
    c.C_data 
from 
    tableB b 
    inner join tableC c 
     on b.A_id = c.A_id; 

et:

select 
    b.B_data, 
    c.C_data 
from 
    tableB b 
    inner join tableA a 
     on b.A_id = a.A_id 
    inner join tableC c 
     on a.A_id = c.A_id; 

I SUS pect que la plupart des bases de données optimisera l'une ou l'autre requête pour être la même, mais y a-t-il des cas où les contraintes de clé étrangère à tableA rendront la connexion via tableA beaucoup plus efficace? Y a-t-il des cas où ces requêtes pourraient produire des résultats différents?

Répondre

2

Vous pouvez aussi bien les rejoindre directement. Les contraintes de clés étrangères ne font rien pour rendre les jointures plus efficaces; Les index font cela, ce qui (selon le SGBD) peut être une question distincte des clés étrangères. Quoi qu'il en soit, s'il y a un index avec lequel travailler, vous l'avez, que vous utilisiez votre clé étrangère ou non.

1

La première version fonctionne très bien. Les relations de clés étrangères concernent l'intégrité référentielle et ne doivent pas nécessairement être traversées telles qu'elles sont définies.

Questions connexes