#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