SQL多个自然内连接

时间:2014-10-06 09:38:39

标签: sql postgresql join natural-join

为什么这会正确返回订单的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 ...

1 个答案:

答案 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是一个经过深思熟虑的功能,除非是快速和脏的即席查询,否则应该真的可以避免。即使它现在有效,如果您稍后将不相关的列添加到表中,它可能会更改现有查询的含义。那是......好吧,避免自然联合。