繁体   English   中英

合并来自多个表的数据发布Oracle 11g

[英]Combining data from multiple tables issue Oracle 11g

表//字段
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 odb1.items i )基本上告诉甲骨文,“对于每一个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。

这显示了我需要的结果。 无论如何,谢谢,如果能帮助到任何人,请加油!

您只提供了5个表之间的两个联接(一个正在USING ,一个在WHERE )-在这种情况下,您将获得所有其他表中所有其他行的笛卡尔积,因此会有大量行。

编辑,暗示您需要将所有表连接在一起,无论是USING还是JOIN

为了使用USING连接糖,在立即lhs和rhs表中必须存在同一列。 对于将多个联接集成到层次结构中,您可能需要像这样嵌套USINGs :SELECT c.company,s.description,m.manu_name,i.quantity,i.total_price FROM客户c JOIN订单o JOIN库存s JOIN项目i在USING(manid),USING(itemid),USING(stockid),USING(customer_num)中进行联接;

where加入不需要,因为我们已经拥有了USING加入

我认为在表之间的一些列和关系, 这提琴在这里

您还可以删除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已经证明,窝没有要求USING连接,提供了连接顺序是明智的,并提供了FK连接列不能跨多个表复制。 http://sqlfiddle.com/#!4/91ef6/9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM