Является ли Natural Join дистрибутивом через Union?

Учитывая три отношения R, S и T, верно ли, что:

R ⋈ (SUT) = (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) .

Следовательно, предложение верно.

В семантике 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.
Другие вопросы по тегам