查询在不期望时返回笛卡尔积

时间:2016-04-04 19:19:54

标签: sql oracle join

任务:选择包含属于SelectionItemPattern类别的产品的所有订单。

结果: OrderNo,OrderDate,产品名称

我写了这个查询,但它返回了笛卡尔积。

‘Sea Food’

问题:我的查询有什么问题?

1 个答案:

答案 0 :(得分: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'

基本上你得到它的原因是你的where子句省略了涉及customers表的连接条件,所以你留下了:

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