【问题标题】:'skipping' a table in SQL inner joins在 SQL 内部联接中“跳过”表
【发布时间】:2009-07-29 11:48:20
【问题描述】:

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

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 的连接效率更高?是否存在这些查询可能产生不同结果的情况?

【问题讨论】:

    标签: sql join inner-join


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      第一个版本运行良好。外键关系与参照完整性有关,不一定要按照定义进行遍历。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-12
        • 2012-12-02
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 2013-10-22
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多