2016-04-04 4 views
1

Задача: Выделить все заказы, принадлежащие категории ‘Sea Food’.Query возвращает декартовую продукцию, если не ожидалось

Результат: OrderNo, OrderDate, Наименование

Я пишу этот запрос, но он возвращает декартово произведение.

select o.orderid, o.orderdate as "Order Date", p.productname , ct.categoryname from orders o, 
order_details od , products p , customers c ,categories ct 
where 
od.orderid = o.orderid and p.productid = od.productid and ct.categoryid = p.categoryid 
and ct.categoryname = 'Seafood'; 

Вопрос: Что случилось с моим запросом?

+2

Во-первых, он использует синтаксис архива, если запятые используются в предложении 'FROM'. Научитесь использовать правильный явный синтаксис JOIN. –

+0

Для объединения таблиц используйте 'join' вместо' where'. Внутренняя работа для них очень различна. Если вы используете предложение where, чтобы присоединиться к вашей таблице, Oracle сначала выполняет декартово произведение всех таблиц, а затем применяет предложения where, поэтому вы получаете декартовский продукт. – Munir

+1

таблица клиентов не используется в предложении where? – cableload

ответ

1

Вы делаете CROSS JOIN на столе customers, так как вы забыли указать соединение. Вот почему вы должны использовать явный синтаксис JOIN, а не старый синтаксис, используя запятые в пункте WHERE.

После перевода запроса в явный синтаксис, вы увидите, что нет WHERE состояния с участием customers таблицы:

select 
o.orderid, 
o.orderdate as "Order Date", 
p.productname, 
ct.categoryname 
from 
orders o, 
inner join order_details od on od.orderid = o.orderid 
inner join products p on p.productid = od.productid 
inner join categories ct on ct.categoryid = p.categoryid 
cross join customers c -- either you don't need this table, or you need to specify conditions 
where 
ct.categoryname = 'Seafood' 

В основном причиной вы получили это было то, что ваше, где опущен раздел условия объединения с участием customers таблицы, так что вы остались с:

from (...), customers -- cross join when joining condition not applied in where clause 
+0

Да после удаления таблицы клиентов из моего запроса он возвращает правильный результат –

Смежные вопросы