2014-12-04 87 views
0

我需要帮助将两个表链接在一起以根据需要恢复数据。 我有两个查询: 第一个如下:Oracle加入两个查询并得出明显答案

SELECT 
     POI.PO_ID as PO_ID, SUM(POI.INV_QTY) AS INV_QTY, POI.INV_NUMBER, 
     PO.SUP_SUP_ID AS SUPPLIER 

    FROM TABLE1 POI, PUR_ORDS PO 
    WHERE POI.PO_ID = '56886' AND POI.PO_ID = PO.PO_ID 
    GROUP BY POI.PO_ID, POI.INV_NUMBER, PO.SUP_SUP_ID 
    ORDER BY POI.INV_NUMBER ASC 

这个查询的结果如下:

PO_ID|INV_QTY|INV_NUMBER|SUPPLIER 
--------------------------------- 
56886| 105|INV1  |SUP1 
56886| 106|INV2  |SUP1 

我有第二个查询是这样的:

SELECT 
     DIL.PO_PO_ID, sum(DIL.ACPTD_QTY) as ACPTD_QTY, 
     DIL.DLVD_DLVY_NUMB AS DEL_NUM 
    FROM TABLE2 DIL 
    where DIL.PO_PO_ID = '56886' 
    GROUP BY PO_PO_ID, DIL.DLVD_DLVY_NUMB 
    order by del_num 

该查询结果如下:

PO_PO_ID|ACPTD_QTY|DEL_NUM 
-------------------------- 
    56886|  105|  1 
    56886|  106|  2 

现在我试图加入的两个表,但我得到多个值出现,使用下列内容:

SELECT DISTINCT(PO_ID), INV_NUMBER, INV_QTY, SUPPLIER, ACPTD_QTY, DEL_NUM 
FROM 
(SELECT 
      SELECT POI.PO_ID as PO_ID, SUM(POI.INV_QTY) AS INV_QTY, 
       POI.INV_NUMBER, PO.SUP_SUP_ID AS SUPPLIER 
      FROM TABLE1 POI, PUR_ORDS PO 
      WHERE POI.PO_ID = '56886' 
      AND POI.PO_ID = PO.PO_ID 
      GROUP BY POI.PO_ID, POI.INV_NUMBER, PO.SUP_SUP_ID 
      ORDER BY POI.INV_NUMBER ASC) POINET 
INNER JOIN 
(SELECT DIL.PO_PO_ID, sum(DIL.ACPTD_QTY) as ACPTD_QTY, 
       DIL.DLVD_DLVY_NUMB AS DEL_NUM 
      FROM TABLE 2 DIL 
      where DIL.PO_PO_ID = '56886' 
      GROUP BY PO_PO_ID, DIL.DLVD_DLVY_NUMB 
      order by DEL_NUM) DILV 

      ON DILV.PO_PO_ID = POINET.PO_ID 
      GROUP BY PO_ID, INV_NUMBER, INV_QTY, SUPPLIER, ACPTD_QTY, DEL_NUM 
      ORDER BY INV_NUMBER 

但是我得到的数据集是这样的:

PO_ID|INV_NUMBER |INV_QTY|SUPPLIER|ACPTD_QTY|DEL_NUM 
----------------------------------------------------- 
56886|K-101/2014-15| 105|SUP1 |  105|  1 
56886|K-101/2014-15| 105|SUP1 |  106|  2 
56886|K-107/2014-15| 106|SUP1 |  105|  1 
56886|K-107/2014-15| 106|SUP1 |  106|  2 

但是我需要它显示以下内容:

PO_ID|INV_NUMBER |INV_QTY|SUPPLIER|ACPTD_QTY|DEL_NUM 
------------------------------------------------------ 
56886|K-101/2014-15| 105|SUP1 |  105|  1 
56886|K-107/2014-15| 106|SUP1 |  106|  2 

我需要做些什么来调整我的查询? 任何帮助将不胜感激。

+0

你能给我们你的表限制吗? – Aramillo 2014-12-04 13:04:50

回答

0

我想你只需要修改你的连接语句加入对两列

ON DILV.PO_PO_ID = POINET.PO_ID 
AND DILV.INV_QTY = POINET.ACPTD_QTY 

其实,你可能可以离开了PO_ID,因为我这是相同的两个子查询:

即只要做到这一点(在第三行):

ON DILV.INV_QTY = POINET.ACPTD_QTY 
+0

嗨 DILV.INV_QTY和POINET.ACPTD_QTY总是会有所不同,实际上永远不会相同。因此,您可能会在INV_QTY上预订的实例可能为10,ACPTD_QTY可能为14 – 2014-12-04 11:49:02

+0

好的 - 从您的描述中不清楚。你得到多行的原因是因为你有效地在你的子查询上进行笛卡尔连接,因为PO_ID总是相同的。在两个子查询中都需要某种标识符,以便您可以唯一地加入它们。没有(基础数据的)示例记录,很难看到应该是什么。 – mlinth 2014-12-04 12:07:16

+0

嗨mlinth,感谢您的回复,不幸的是,链接两个表的唯一方法是PO_ID,没有其他方式的链接。所以我不确定这是否可行或者是否可行,我如何才能做到这一点。 谢谢 Harmz – 2014-12-04 12:20:42