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