Естественное соединение таблицы (А) с самим собой

Я наткнулся на этот вопрос в одном из интервью, и мне было интересно, правильно ли я поступил. Допустим, у меня есть таблица "А" со следующими атрибутами:

R   S    T
-----------
a1  b1   c1
a1  b2   c2
a1  b3   c3
a4  b4   c4

и скажем, мне нужно вычислить реляционную алгебру для заданного B = {[(проекция)R,S (A) ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ (проекция) S,T (A) ] ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ (проекция)R,T (A)}

какой будет результат?

Вот что я попробовал:

-We know (A) NATURAL JOIN (A) = A
-I did the first set of join within the square bracket. Since we had  attribute 'S' in common I just yielded the result to be a table of (R S T) with the same 4 rows of tuples.
-Finally, I joined (R S T) with the second set of join where attributes 'R' and 'T' are common which I assumed will yield R S T again with 4 rows of tuples.

То есть, так, как я это сделал, я получил B = A.

Я вообще не рассматривал кортежи, я просто сделал естественное объединение на основе общих атрибутов между двумя проекциями.

Я знаю, что это очень глупо... но я пытаюсь выполнить его в MySQL, и по какой-то причине я получаю ошибки, когда пытаюсь выполнить такой запрос:

выберите A,B из dbt2.relationalalgebra как r1 ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ (выберите B, C из dbt2.relationalalgebra как r2); и я получаю сообщение о том, что каждая производная таблица должна иметь свои псевдонимы!

Пожалуйста, помогите мне уточнить, как Natural join работает на одном столе.

Заранее благодарю за любую помощь.

2 ответа

Решение

То, что вы сделали, правильно. И это правильно, что вы получили B = A - учитывая, что содержание для A.

Это вопрос о функциональных зависимостях между значениями в данных. (Таким образом, вы можете не получить B = A, если данные были другими.)

Для атрибутов S и T в каждом кортеже есть разные значения. Таким образом, учитывая значение для S (или T), вы знаете, из какой он строки, поэтому вы знаете значение для двух других атрибутов в этом кортеже. Функциональные зависимости: S -> R, T; T -> R, S. (Вы можете сказать, что S или T являются ключами для A.)

Каждая пара атрибутов в проекциях, которые вы даете, включает в себя хотя бы один ключ, поэтому однозначно определите, какой "отсутствующий" атрибут будет объединен. Вы видите разложение без потерь, согласно теореме Хита. http://en.wikipedia.org/wiki/Functional_dependency

Естественное объединение - это сокращение для объединения двух таблиц (или подзапросов) во всех столбцах с одинаковыми именами.

Естественное соединение таблицы с самим собой может иметь несколько последствий. Наиболее распространенной будет сама таблица - если ни одно из значений не равно NULL и строки являются уникальными. Если каждый ряд имел NULL значение в некотором столбце, то natural join не будет возвращать строк вообще. Если строки дублируются, могут появиться несколько строк.

Я не рекомендую когда-либо использовать natural join, Небольшое изменение в базовой структуре таблицы может нарушить запрос.

Другие вопросы по тегам