首页 > 解决方案 > 稍微修改SQL给我带来:ORA-01427:单行子查询返回多于一行

问题描述

我正在使用 Oracle Fusion,即财务/应付账款报告方面

我有以下代码:

SELECT DISTINCT PHA.SEGMENT1 
FROM 
    AP_INVOICES_ALL AIA, -- https://docs.oracle.com/en/cloud/saas/financials/19a/oedmf/AP_INVOICES_ALL-tbl.html
    PO_HEADERS_ALL PHA -- https://docs.oracle.com/applications/farel12/procurementop_gs/OEDMP/PO_HEADERS_ALL_tbl.htm
WHERE
    AIA.PO_HEADER_ID = PHA.PO_HEADER_ID 
    AND AIA.PO_HEADER_ID IS NOT NULL 
    AND AIA.INVOICE_NUM = XTE.TRANSACTION_NUMBER 
    AND AIA.INVOICE_ID = XTE.SOURCE_ID_INT_1

这“有效”是因为它不返回任何错误。但是它正在查看错误的表,因此正在带回错误的数据。没什么大不了的,我们已经确定了它是哪张桌子。

它在如下更广泛的上下文中用于定义列值

( 
        CASE
          WHEN
            GJH.JE_SOURCE IN 
            (
              'Purchasing', 'Payables'
            )
          THEN
( 
            SELECT DISTINCT
              PHA.SEGMENT1 
            FROM
              AP_INVOICES_ALL AIA, PO_HEADERS_ALL PHA 
            WHERE
              AIA.PO_HEADER_ID = PHA.PO_HEADER_ID 
              AND AIA.PO_HEADER_ID IS NOT NULL 
              AND AIA.INVOICE_NUM = XTE.TRANSACTION_NUMBER 
              AND AIA.INVOICE_ID = XTE.SOURCE_ID_INT_1

              ) 
            WHEN
              GJH.JE_SOURCE IN 
              (
                'Receipt Accounting'
              )
            THEN
( 
              SELECT
                CPOD.PO_NUMBER 
              FROM
                --cmr_transactions ct
                CMR_PURCHASE_ORDER_DTLS CPOD , CMR_RCV_EVENTS CRE , POZ_SUPPLIERS_V PS 
              WHERE
                CRE.CMR_PO_DISTRIBUTION_ID = CPOD.CMR_PO_DISTRIBUTION_ID 
                AND CPOD.VENDOR_ID = PS.VENDOR_ID 
                AND CPOD.ACTIVE_FLAG = 'Y' 
                AND CRE.ACCOUNTING_EVENT_ID = XTE.SOURCE_ID_INT_1 ) 
              ELSE
                NULL 
        END
) AS PURCHORDERNUM,

但是我需要将 SQL 修改为以下内容:

SELECT DISTINCT PHA.SEGMENT1 
FROM
    AP_INVOICE_LINES_ALL AIA, -- https://docs.oracle.com/en/cloud/saas/financials/19a/oedmf/AP_INVOICE_LINES_ALL-tbl.html
    PO_HEADERS_ALL PHA 
WHERE
    AIA.PO_HEADER_ID = PHA.PO_HEADER_ID 
    AND AIA.PO_HEADER_ID IS NOT NULL 
    --AND AIA.INVOICE_NUM = XTE.TRANSACTION_NUMBER 
    AND AIA.INVOICE_ID = XTE.SOURCE_ID_INT_1

现在这让我回来了ORA-01427: single-row subquery returns more than one row,但我不明白为什么。我只是在更改它正在查看的表使用 DISTINCT

标签: sqloracle

解决方案


使用DISTINCT并不意味着您只会获得一条记录。这意味着您将在结果集中获得每个不同的值之一。这意味着如果返回 5 条记录:

value1
value2
value2
value1
value3

使用DISTINCT您将获得如下所示的结果集:

value1
value2
value3

您需要确保在WHEREorON子句中有足够的标准来确保返回单个值。


推荐阅读