'跳过'SQL内连接中的表

时间:2009-07-29 11:48:20

标签: sql join inner-join

我的意思是,如果我有以下架构:

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

我怀疑大多数数据库会优化任一查询是否相同,但是有些情况下tableA的外键约束会使tableA的加入效率更高吗?是否存在这些查询可能产生不同结果的情况?

2 个答案:

答案 0 :(得分:2)

您也可以直接加入他们。外键约束不会使连接更有效;索引做到这一点,它(取决于DBMS)可能是与外键不同的事情。无论哪种方式,如果有一个索引可以使用,无论你是否使用外键,都可以使用它。

答案 1 :(得分:1)

第一个版本运行正常。外键关系是关于引用完整性的,并不一定必须遍历它们。