【问题标题】:Oracle Join Two Queries With Distinct AnswerOracle 连接两个具有不同答案的查询
【发布时间】:2014-12-04 11:36:44
【问题描述】:

我需要帮助将两个表链接在一起,以便根据需要返回数据。 我有两个疑问: 第一种如下:

    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

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

【问题讨论】:

  • 你能给我们你的表格限制吗?

标签: oracle join distinct


【解决方案1】:

我认为您只需要修改您的联接语句即可加入两列

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

其实你可以省略 PO_ID,因为我在两个子查询中都是一样的:

即只需这样做(在倒数第三行):

ON DILV.INV_QTY = POINET.ACPTD_QTY

【讨论】:

  • 嗨,DILV.INV_QTY 和 POINET.ACPTD_QTY 总是不同的,而且永远不会相同。因此,可能存在您在 INV_QTY 上预订的实例可能是 10 而 ACPTD_QTY 可能是 14
  • 好的 - 从你的描述中看不清楚。您获得多行的原因是因为您有效地对子查询进行笛卡尔连接,因为 PO_ID 始终相同。您需要在两个子查询中使用某种标识符,以便您可以唯一地加入它们。如果没有(基础数据的)示例记录,很难看出应该是什么。
  • 您好,感谢您的回复,不幸的是,链接这两个表的唯一方法是通过 PO_ID,没有其他链接方式。所以我不确定这是否可能,或者如果是,我如何才能实现这一点。谢谢哈姆兹
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多