Natural Join 对 Union 有分配性吗?
Is Natural Join distributive over Union?
给定三个关系 R、S 和 T,是否为真:
R ⋈ (S U T) = (R ⋈ S) U (R ⋈ T)
如果是,我们可以证明吗?
是的。
假设我们有 3 个关系 R、S、T。
首先你要知道S和T必须是union compatible才能进行union运算,也就是说两个关系有相同的域
证明左 -> 右:
假设行r属于左操作集。然后,对于那些最初来自 S 或 T 的值,它们必须出现在关系 S 或 T 中。不失一般性,假设它们来自 S。那么,行 r 属于 R ⋈ S.
证明右 -> 左:
假设行r'属于右操作集。那么,r要么属于
R ⋈ S 或 R ⋈ T.
不失一般性,假设r属于R ⋈ S。那么,对于那些最初来自S的值,它也属于S U T中的一行。
因此,r'属于R ⋈ (S U T) .
因此,命题正确。
在 Set 语义下,如 Tipton 的回答所示,这成立,但在 bag 语义下,正如 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.
给定三个关系 R、S 和 T,是否为真:
R ⋈ (S U T) = (R ⋈ S) U (R ⋈ T)
如果是,我们可以证明吗?
是的。
假设我们有 3 个关系 R、S、T。
首先你要知道S和T必须是union compatible才能进行union运算,也就是说两个关系有相同的域
证明左 -> 右:
假设行r属于左操作集。然后,对于那些最初来自 S 或 T 的值,它们必须出现在关系 S 或 T 中。不失一般性,假设它们来自 S。那么,行 r 属于 R ⋈ S.
证明右 -> 左:
假设行r'属于右操作集。那么,r要么属于 R ⋈ S 或 R ⋈ T.
不失一般性,假设r属于R ⋈ S。那么,对于那些最初来自S的值,它也属于S U T中的一行。
因此,r'属于R ⋈ (S U T) .
因此,命题正确。
在 Set 语义下,如 Tipton 的回答所示,这成立,但在 bag 语义下,正如 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.