2014-10-06 55 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是一個思路不清的特性,除非是快速和骯髒的臨時查詢,否則應該避免這種特性。即使它現在可以工作,但如果稍後將不相關的列添加到表中,它可能會改變現有查詢的含義。這是...好吧,避免自然連接。