组合来自多个表的数据会发出Oracle 11g

时间:2014-11-05 03:58:18

标签: sql oracle join oracle11g

表//字段
Customer // Company
Stock // Description
Manufact // Manu_Name
Items // Quantitytotal_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。

这显示了我需要的结果。无论如何,谢谢,如果这有助于任何人,欢呼!

1 个答案:

答案 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