2014-10-06 58 views
0

为什么这个正确退回订单的Order ID,谁作出命令的人的Customer ID和员工负责交易的Last NameSQL多种自然内部联接

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

当您使用正确的(即明确的)连接时会发生什么? – 2014-10-06 09:49:49

+0

无法重现:请参阅http://sqlfiddle.com/#!15/ff9db/3。它似乎甚至不区分大小写(但我可能在这一点上是错误的)。 – 2014-10-06 09:51:58

+6

根据猜测,有*太多*常见的列,而一个意想不到的是匹配。不要使用自然连接,它们很糟糕。使用'INNER JOIN ... ON(...)'或者如果你必须使用'INNER JOIN ... USING(colname)'。 – 2014-10-06 09:56:09

回答

1

没有看到你的满,未经编辑模式很难确定,但我会说有比你预期的更常见的列。

例如作为@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是一个思路不清的特性,除非是快速和肮脏的临时查询,否则应该避免这种特性。即使它现在可以工作,但如果稍后将不相关的列添加到表中,它可能会改变现有查询的含义。这是...好吧,避免自然连接。