将等值连接作为自然连接执行

问题描述 投票:0回答:1

我是SQL的新手。

我希望执行一个包含两个表的查询,这些表既是等值联接又是自然联接,在这里我按城市计算客户下订单的实例。我假设一个客户已经下订单,如果他们的客户ID出现在ordertable关系中。

[我试图在一个查询中组合等值连接,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. LA | 34
  3. SF | 17
  4. SLC | 170
  5. 图森| 34

我相信第一组结果是正确的,但是我不明白为什么两种不同的方法会产生不同的结果。

sql join group-by count
1个回答
1
投票

您正在比较苹果和橘子,并说明为什么应避免使用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;

您的第二个查询正在联接到一个没有orderlinedifferentcust_id。因此,“自然连接”正在生成笛卡尔积。

注意以下内容:

  • joinfrom子句中是显式的。
  • join条件在查询中是显式的。没猜到。
  • 表别名使查询更易于编写和阅读。

我认为natural join是可憎的,因为它没有考虑正确声明的外键关系。相反,它仅依赖于列的命名约定来匹配表。

并且,未检测到应导致错误的问题-例如缺少join键。

© www.soinside.com 2019 - 2024. All rights reserved.