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