При трех отношениях R, S и T верно ли, что:
R ⋈ (S U T) = (R ⋈ S) U (R ⋈ T)
Если да, можем ли мы это доказать?
При трех отношениях R, S и T верно ли, что:
R ⋈ (S U T) = (R ⋈ S) U (R ⋈ T)
Если да, можем ли мы это доказать?
ДА.
Предположим, у нас есть 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, оно также принадлежит строке в S U T.
Следовательно, r' принадлежит R ⋈ (SU T) .
Следовательно, предложение верное.
В семантике Set, как показано в ответе Типтона, это выполняется, но в семантике мешков, как они используются в 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.