2009-07-29 62 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; 

我SUS大多數數據庫將優化任何查詢都是相同的,但是有沒有這種情況下,tableA的外鍵約束將使通過tableA更有效地加入?有沒有這些查詢可能產生不同結果的情況?

回答

2

您不妨直接加入。外鍵約束沒有做任何事情來使連接更有效率;索引做到這一點,這取決於DBMS可能與外鍵分開。無論哪種方式,如果有索引可以使用,無論您是否通過外鍵進行操作,都可以使用該索引。

1

第一個版本正常工作。外鍵關係是關於參照完整性的,並不一定必須在定義時遍歷。