2

给定三个关系 R、S 和 T,是否真的:

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

如果是,我们能证明吗?

4

2 回答 2

1

是的。

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

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

证明左 -> 右:

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

证明右 -> 左:

假设行 r'属于右操作集。那么,r 要么属于 R ⋈ S 要么属于 R ⋈ T。

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

因此,r' 属于 R ⋈ (SUT) 。

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

于 2015-11-14T01:51:08.233 回答
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.
于 2016-04-18T14:06:18.350 回答