Реляционная алгебра: естественное соединение с нулевым значением

#relational-database #relational-algebra #natural-join

#реляционная база данных #реляционная алгебра #естественное соединение

Вопрос:

Таблица 1

 Customer  id  city 
John       1   LA
Nancy      2   NULL
  

Таблица 2

 Customer  $ in the pocket 
John       20
Nancy      30
  

Мне интересно, что произойдет, если Table 1 естественное соединение с Table 2 ? Я предполагаю, что результатом будет 4 атрибута, и появятся как Джон, так и Нэнси.

Но мой друг сказал мне, что появится только Джон, Нэнси не появится, потому что есть null значение.

Комментарии:

1. объединения происходят по двум атрибутам, и если вы объединяетесь с использованием Customer (который будет использоваться по умолчанию), тогда ваш друг ошибается 🙂

2. Чтобы понять это, просто перепишите ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ как обычное ВНУТРЕННЕЕ РАВНОСОЕДИНЕНИЕ, используя те же правила, которые использует ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ. Учитывая отношения в вашем примере, это было бы равнозначным для Customer атрибута. (Значение NULL в атрибуте city не имеет значения, поскольку у другого отношения нет атрибута с именем city .) ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ будет использовать все атрибуты с одинаковыми именами. Если бы второе отношение также имело атрибут с именем city , это было бы то же самое, что и ВНУТРЕННЕЕ РАВНОДЕЙСТВУЮЩЕЕ СОЕДИНЕНИЕ для обоих атрибутов Customer и city .

3. Для естественного соединения мы присоединяемся только в том случае, если у нас есть соответствующий общий атрибут (в данном случае это поле Customer)?

4. @spencer7593, так что, если общий атрибут не содержит null , тогда все было бы хорошо?

5. Я бы не стал заходить так далеко, говоря, что «ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ» было бы хорошо. За пределами академических кругов мы никогда не используем ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ. (Все, что нам нужно, это чтобы кто-то добавил столбец с именем table2 city , и наш запрос, который работал, был нарушен.) Когда я сталкиваюсь с ЕСТЕСТВЕННЫМ СОЕДИНЕНИЕМ, мне нужно просмотреть все столбцы в обеих таблицах и найти все совпадения, чтобы понять, что это на самом деле делает. И пока я это делаю, я тихо проклинаю разработчика, который все время спасал себя, набирая » NATURAL » вместо » ON a.customer = b.customer «, чтобы я мог потратить в двадцать раз больше времени, чтобы разобраться.

Ответ №1:

В приведенном выше случае ваш друг ошибается, вы правы!

Давайте посмотрим случай, когда было бы иначе:

Таблица «Клиент»

 Id Name   AccNo
1  John    44
2  Nancy  NULL 
  

Таблица «Учетная запись»

 AccNo $_in_Pocket
44       20
45       30
  

Здесь, при естественном соединении, мы получили бы все атрибуты для Джона, но Нэнси отсутствовала бы в результатах.

Комментарии:

1. Вам не нужно форматировать свой ответ с помощью HTML-тегов и сущностей, вместо этого используйте правильное форматирование ответа Stackoverflow