是自然加入对联盟的分配吗?

时间:2015-11-14 01:27:23

标签: database join relational-database relational-algebra natural-join

鉴于R,S和T三个关系,是否正确:

R⋈(S U T)=(R⋈S)U(R⋈T)

如果是,我们可以证明吗?

2 个答案:

答案 0 :(得分:1)

YES。

假设我们有3个关系R,S,T。

首先,你应该知道S和T必须是联合兼容才能执行联合操作,这意味着两个关系具有相同的字段。

向左证明 - >右:

假设行r 属于左侧操作集。然后,对于最初来自S或T的那些值,它们必须出现在关系S或T中。不失一般性,假设它们来自S.然后,行r 属于R⋈S. / p>

证明正确 - >左:

假设行r' 属于右侧操作集。然后,r要么属于 R⋈S或R⋈T.

不失一般性,假设r属于R⋈S.那么,对于那些最初来自S的值,它也属于S U T中的一行

因此,r'属于R⋈(S U T)。

因此,这个命题是正确的。

答案 1 :(得分:1)

在Set语义下,如Tipton的答案所示,这是有效的,但在包语义下,正如SQL所使用的那样,它不是。考虑反例:

    > create table R(A TEXT);
    Query executed in 0 min. 0 sec 5 msec.
    > create table S(A TEXT);
    Query executed in 0 min. 0 sec 1 msec.
    > create table T(A TEXT);
    Query executed in 0 min. 0 sec 2 msec.
    > insert into R values('a');
    Query executed in 0 min. 0 sec 1 msec.
    > insert into R values('a');
    Query executed in 0 min. 0 sec 0 msec.
    > insert into S values('a');
    Query executed in 0 min. 0 sec 1 msec.
    > insert into T values('a');
    Query executed in 0 min. 0 sec 1 msec.
    > select * from (select * from R JOIN (select * from S UNION select * from T) u ON R.A=u.A);
    a|a
    a|a
    --- [0|Column names ---
    [1|A [2|A:1 
    Query executed and displayed **2 rows** in 0 min. 0 sec 11 msec.
    > select * from R JOIN S ON R.A=S.A UNION select * from R JOIN T ON R.A=T.A;
    a|a
    --- [0|Column names ---
    [1|A [2|A 
    Query executed and displayed **1 row** in 0 min. 0 sec 20 msec.