表//字段
Customer
// Company
Stock
// Description
Manufact
// Manu_Name
Items
// Quantity
,total_price
我正在使用Oracle 11g Application Express。我需要显示为每个客户订购的每个库存清单。我需要显示制造商,订购数量和支付的总价。
当我在SQL * PLUS命令提示符下运行此查询时,它会无休止地显示所提到的表中的结果,直到我强制退出(ctrl + c)应用程序。这令人难以置信的沮丧 - 我尝试使用EXISTS条款加入表格,我只是不知道该怎么做。任何见解都会很精彩 - 不是要找人来为我解决这个问题,而是更多 - 所以请引导我。
SELECT c.company, s.description, m.manu_name, i.quantity, i.total_price
FROM db1.customer c JOIN db1.orders o USING (customer_num), db1.stock s, db1.manufact m, db1.items i
WHERE o.order_num = i.order_num;
这导致一个永无止境的显示结果,结果,结束,结束和结束
基本上,我需要显示每个库存订单所需的信息。但是,我在列的输出显示中不需要order_num
,因此我认为我需要使用order_num
(在db1.orders o
& db1.items i
中)告诉Oracle,“对于每个order_num(如果没有order_num,订单不能存在),显示(结果)......
我非常迷失 - 我尝试过外连接,我尝试使用EXIST操作符,我只是难倒,我觉得这很容易让我忽略。
这就是我这样做的,以防其他人遇到这个问题:
SELECT c.company, s.description, m.manu_name, i.quantity, i.total_price
FROM db1.customer c JOIN db1.orders o USING (customer_num)
JOIN db1.items i USING (order_num)
JOIN db1.stock USING (stock_num)
JOIN db1.manufact m ON m.manu_code = s.manu_code
ORDER BY c.company, s.description;
如果您JOIN db1.manufact m USING (manu_code)
,则会从Oracle收到ambiguously defined column
错误 - 这是因为我已经加入了其他表,并且该列位于其中一个表中(这是db1.stock
表)。您仍然可以加入它们,但您必须使用JOIN ON。
这显示了我需要的结果。无论如何,谢谢,如果这有助于任何人,欢呼!
答案 0 :(得分:1)
您在5个表之间只提供了两个连接(一个USING
和一个WHERE
) - 在这种情况下,您将获得所有其他表中所有其他行的笛卡尔积,因此行数很多。
(编辑,暗示您需要将所有表格加在一起,无论是USING
还是JOIN
)
为了使用USING
连接糖,必须在直接的lhs和rhs表中存在相同的列。 对于多个连接,在层次结构中,您可能需要嵌套USINGs
,如下所示:
SELECT c.company,s.description,m.manu_name,i.quantity,i.total_price
来自客户c
加入订单o
加入股票
加入项目i
加入制造使用(manid)
使用(itemid的)
使用(stockid)
使用(customer_num);
德尔>
由于我们已经有where
加入
USING
加入
我在this fiddle here中的表格中假设了一些列和关系:
您也可以删除USING
并使用显式JOIN
语法,这样可以避免嵌套(这在ANSI世界中也更容易移植):
SELECT c.company, s.description, m.manu_name, i.quantity, i.total_price
FROM customer c
INNER JOIN orders o on c.customer_num = o.customer_num
INNER JOIN stock s on o.stockid = s.stockid
INNER JOIN items i on i.itemid = s.itemid
INNER JOIN manufact m on m.manid = i.manid;
修改强>
正如OP已经证明的那样,如果连接顺序合理,并且假设FK JOIN列不在多个表中重复,则不需要嵌套USING
连接。
http://sqlfiddle.com/#!4/91ef6/9