...每个表的同一列将出现一次
是Natural Join
的。
...并且只有关系行会出现。
我不知道那是什么意思。
我不同意那些说:不要使用Natural Join
. 但是,如果您打算将其Natural Join
用于查询,那么您必须设计架构以便(松散地说)“相同的列名意味着相同的事情”,这当然是真的。
然后这个练习将教你使用同名列但含义不同的危险。这种危险有时被称为“连接陷阱”或“连接陷阱”。(并不是一个真正的陷阱:您只需要学习在设计不佳的模式上编写查询的方法。)
更准确的说法是:如果您在两个不同的表中有同名的列,则该列必须是其中至少一个的键。所以:
city
不是任何这些表中的键,因此不应在Natural Join
.
salesman_id
不是 table 中的键customer
,因此不应在 table 的连接中“捕获” orders
。
修复此查询的主要方法是重命名某些列以避免“捕获”(见下文)。还值得一提的是,一些 SQL 方言允许:
SELECT *
FROM orders
NATURAL JOIN customer ON customer_id
...
这ON column(s)
句话的意思是:验证两个表之间唯一的共同列是那些命名的。否则拒绝查询。所以你的查询将被拒绝。
重命名意味着你不应该使用SELECT *
. (无论如何,这对于“生产代码”是危险的,因为每次架构更改时您的查询可能会产生不同的列。)解决这个问题的最简单方法可能是为您的三个基表创建三个视图,“意外”相同 -给定其他名称的命名列。对于这一查询:
SELECT ord_no, purch_amt, ord_date, customer_id,
salesman_id AS order_salesman_id
FROM orders
NATURAL JOIN (SELECT customer_id, cust_name,
city AS cust_city, grade,
salesman_id AS cust_salesman_id
FROM customer) AS customer_grr
NATURAL JOIN (SELECT salesman_id, name,
city AS salesman_city,
commission
FROM salesman) AS salesman_grr
我正在使用显式AS
来显示重命名。大多数 SQL 方言允许您省略该关键字;就放city cust_city, ...
。