Почему необходимо явно указывать внешние ключи при объединении таблиц в SQL? - PullRequest
0 голосов
/ 18 июня 2019

SQL-сервер знает о зависимостях таблиц, основанных на внешних ключах, так почему необходимо явно указывать JOIN ON внешние ключи?

Реальный рабочий пример (этот запрос работает):

SELECT * FROM users
INNER JOIN roles ON users.role_id=roles.id

Неявный пример (этот запрос не работает):

SELECT * FROM users
INNER JOIN roles

Не должен SQL неявнои правильно предположить, что если не указано ключевое слово ON, соединение должно выполняться на внешних ключах?

Я понимаю, что выгода от этого может быть тривиальной, но после использования этой функции в API-интерфейсах SQL, таких как Java Hibernate'sЯзык запросов Я не понимаю, почему это не будет встроено в SQL.


РЕДАКТИРОВАТЬ

Спасибо за ответы до сих пор.Хотя они и интересны, ни один из них не отвечает на первоначальный вопрос, касающийся SQL Server.

Ответы [ 3 ]

3 голосов
/ 18 июня 2019

SQL поддерживает поддержку этого понятия. Стандарт включает natural join, который в SQL Server счастливо не реализован. Это позволяет вам:

SELECT *
FROM users u NATURAL JOIN
     roles r;

A natural join не имеет предложения on.

Увы, это немного отличается от того, что вы предлагаете. Вместо использования внешних ключей он просто использует столбцы с одинаковыми именами. Я считаю это мерзостью, потому что в SQL есть явные объявления внешних ключей, и это было бы правильным местом для их использования.

2 голосов
/ 18 июня 2019

Для таблиц вполне нормально иметь несколько внешних связей между ними.

В этом случае, что вы ожидаете от базы данных, если между двумя таблицами есть два FK?Выбрать случайным образом?

Типичный пример:

  • Стол CLIENT.
  • Стол PURCHASE.Поскольку покупка происходит между двумя клиентами, ей нужно два FK на CLIENT: seller_id и customer_id , оба указывают на CLIENT.
1 голос
/ 19 июня 2019

Каждый раз, когда происходят неявные операции, становится все труднее делать именно то, что вы хотите.Поначалу естественное объединение кажется быстрым, но если вам нужно его отладить, вам нужно будет выяснить, как именно работает объединение.Это было с использованием внешних ключей?Это были просто колонки с одинаковыми именами?Я сейчас использую NHIBERNATE, и, похоже, всем в моей команде гораздо труднее делать именно то, что нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...