2009-07-29 4 views
4

То, что я имею в виду, если я имел следующую схему:«пропуск» таблицы в SQL внутренние соединения

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 
); 

Если бы я хотел, чтобы получить B_data и C_data, используя отношения, описанные здесь, есть ли разница между следующее:

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

и:

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 что большинство баз данных оптимизируют любой запрос как один и тот же, но есть ли случаи, когда ограничения внешнего ключа на tableA сделают соединение через tableA намного более эффективным? Существуют ли случаи, когда эти запросы могут давать разные результаты?

ответ

2

Вы можете присоединиться к ним напрямую. Внешние ограничения ключа не делают ничего, чтобы сделать объединения более эффективными; индексы делают это, что (в зависимости от СУБД) может быть отдельным вопросом от внешних ключей. В любом случае, если есть индекс для работы, у вас есть он независимо от того, идет ли речь по вашему внешнему ключу.

1

Первая версия работает нормально. Внешние ключевые отношения касаются ссылочной целостности и необязательно должны проходить через их определение.

Смежные вопросы