为什么这会正确返回订单的Order ID
,订单人员的Customer ID
以及负责交易的员工的Last Name
SELECT "OrderID", "CustomerID", "LastName"
FROM orders O
NATURAL INNER JOIN customers JOIN employees ON O."EmployeeID" = employees."EmployeeID";
而
SELECT "OrderID", "CustomerID", "LastName"
FROM orders O
NATURAL INNER JOIN customers NATURAL INNER JOIN employees;
返回0行?
我确信他们有共同的专栏。
Table orders
OrderId
EmployeeID
CustomerID
...
Table employees
EmployeeID
...
Table customers
CustomerID
...
答案 0 :(得分:1)
如果没有看到完整的,未经编辑的架构,很难确定,但我要说有比您预期的更常见的列。
E.g。 @ClockworkMuse sugested:
CREATE TABLE orders (
OrderId integer primary key,
EmployeeID integer not null,
CustomerID integer not null,
created_at timestamp not null default current_timestamp,
...
);
CREATE TABLE employees (
EmployeeID integer primary key,
created_at timestamp not null default current_timestamp,
...
);
然后orders NATURAL JOIN employees
将等同于orders INNER JOIN employees USING (EmployeeID, created_at)
。这肯定不是你想要的。
您应该使用INNER JOIN ... USING (colname)
或INNER JOIN ... ON (condition)
。
NATURAL JOIN
是一个经过深思熟虑的功能,除非是快速和脏的即席查询,否则应该真的可以避免。即使它现在有效,如果您稍后将不相关的列添加到表中,它可能会更改现有查询的含义。那是......好吧,避免自然联合。