3 つの関係 R、S、および T が与えられた場合、次のことが真になります。
R ⋈ (SUT) = (R ⋈ S) U (R ⋈ T)
はいの場合、それを証明できますか?
3 つの関係 R、S、および T が与えられた場合、次のことが真になります。
R ⋈ (SUT) = (R ⋈ S) U (R ⋈ T)
はいの場合、それを証明できますか?
はい。
3 つの関係 R、S、T があるとします。
まず、S と T は共用体操作を実行するために共用体互換でなければならないことを知っておく必要があります。つまり、2 つのリレーションは同じフィールドを持ちます。
左を証明 -> 右:
行rが左操作の集合に属しているとします。次に、元が S または T の値については、関係 S または T のいずれかに出現する必要があります。一般性を失うことなく、それらが S からのものであると仮定します。次に、行 rは R ⋈ S に属します。
右を証明 -> 左:
行r'が右操作の集合に属しているとします。次に、r は R ⋈ S または R ⋈ T のいずれかに属します。
一般性を失うことなく、r が R ⋈ S に属しているとします。次に、元が S の値については 、SU Tの行にも属します。
したがって、r' は R ⋈ (SUT) に属します。
したがって、命題は正しい。
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.