SQL несколько естественных внутренних объединений

Почему это правильно возвращает 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 ответ

Решение

Трудно быть уверенным, не видя вашей полной, неотредактированной схемы, но я бы сказал, что есть более распространенные столбцы, чем вы предполагали.

Например, @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 это плохо продуманная функция, которую следует избегать, за исключением быстрых и грязных специальных запросов, если даже тогда. Даже если это работает сейчас, если позже вы добавите несвязанный столбец в таблицу, это может изменить смысл существующих запросов. Это... хорошо, избегайте естественных соединений.

Другие вопросы по тегам