Выполнение эквиджоина как естественного соединения - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в SQL.

Я хочу выполнить запрос, включающий две таблицы как в виде эквиджоин, так и в виде естественного соединения, где я подсчитываю, сколько клиентов размещали заказы по городам. Я предполагаю, что клиент разместил заказ, если его идентификатор клиента появляется в отношении ordertable.

Я пытаюсь объединить equijoin, COUNT() и GROUP BY в одном запросе, а затем повторить то же самоезапросить с помощью NATURAL JOIN в другом.

Пожалуйста, обратитесь к приведенному ниже коду для моих попыток и их результатов.

Следующее уравнение:

SELECT customer.city, COUNT(*) AS total FROM customer, ordertable
WHERE customer.cust_id = ordertable.cust_id
GROUP BY customer.city
ORDER BY customer.city ASC
;

выход

  1. Город |Количество
  2. SF |1
  3. SLC |7
  4. Тусон |2

Но:

SELECT city, COUNT(*) AS total
FROM customer
NATURAL JOIN orderline
GROUP BY customer.city, city
ORDER BY customer.city ASC
;

урожайность

  1. Город |Итого
  2. ЛА |34
  3. SF | 17
  4. SLC |170
  5. Тусон |34

Я считаю, что первый набор результатов верен, но я не понимаю, почему два разных подхода дают разные результаты.

1 Ответ

1 голос
/ 15 октября 2019

Вы сравниваете яблоки и апельсины и показываете, почему следует избегать natural join с. Просто не используйте их.

Запрашиваемый вами запрос:

SELECT c.city, COUNT(*) AS total
FROM customer c JOIN
     ordertable ot
     ON c.cust_id = ot.cust_id
GROUP BY c.city
ORDER BY c.city ASC;

Ваш второй запрос объединяется с другой таблицей , orderline, котораяне имеет cust_id. Итак, «естественное соединение» порождает декартово произведение.

Обратите внимание на следующее:

  • join явно указано в предложении from.
  • Условия join явно указаны в запросе. Не догадываясь.
  • Псевдонимы таблиц облегчают написание и чтение запроса.

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

И проблемы, которые могут привести к ошибке - например, отсутствующий ключ join, не обнаруживаются.

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