Естественное соединение таблицы (А) с самим собой
Я наткнулся на этот вопрос в одном из интервью, и мне было интересно, правильно ли я поступил. Допустим, у меня есть таблица "А" со следующими атрибутами:
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
, Небольшое изменение в базовой структуре таблицы может нарушить запрос.