得到以下错误 ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”

Posted

技术标签:

【中文标题】得到以下错误 ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”【英文标题】:Getting the following error ORA-01427: single-row subquery returns more than one row 01427. 00000 - "single-row subquery returns more than one row" 【发布时间】:2017-12-15 22:09:31 【问题描述】:

我收到以下错误:

我想从第一个查询中获取一个列值并将该值传递给下一个查询。

ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”


使用以下查询:

 with

deal_XX AS(

SELECT distinct idh.vendor supplier
                  ,idh.deal_id
                  ,mff_report.mff_merch_sql.get_sup_name(idh.vendor) sup_name


              FROM im_doc_head idh
                  ,mff_report.stage_complex_deal_head_hist scdhh
                  ,im_complex_deal_detail icdd
                  ,mff_report.v_loc vl
                  ,item_master im
                                  ,item_master im_parent
             WHERE (   (    idh.type IN ('DEBMEC','CRDMEC') --Debit and Credit Memos in APPROVED or POSTED
                        AND idh.status IN ('APPRVE','POSTED'))
                    OR (    idh.type = 'CRDNRC'             --Credit Note Requests in APPROVED or MATCHED
                        AND idh.status IN ('APPRVE','MTCH')))
               AND idh.deal_type = 'C'
               AND NVL(:PM_supplier,idh.vendor) = idh.vendor

               AND idh.deal_id = scdhh.deal_id (+)
               AND SUBSTR(idh.ext_doc_id,(INSTR(idh.ext_doc_id,'-',1) + 1),INSTR(idh.ext_doc_id,'-',1,2) - (INSTR(idh.ext_doc_id,'-',1) + 1)) = scdhh.deal_detail_id (+)
               AND idh.doc_date = scdhh.end_invoice_date (+)
               AND idh.doc_id = icdd.doc_id
               AND icdd.location = vl.loc
               AND icdd.item = im.item
                               AND im.item_parent = im_parent.item (+)
               AND (   :PM_supplier IS NOT NULL
                    OR :PM_doc_date_from IS NOT NULL
                    OR :PM_doc_date_to IS NOT NULL
                    OR :PM_approval_date_from IS NOT NULL
                    OR :PM_approval_date_to IS NOT NULL
                    OR :PM_ext_doc_id IS NOT NULL
                    OR :PM_batch_mode = 'Y')
                    )  

  select distinct  ship.order_no    , (select deal_id from deal_XX) hhhh
  from ordloc_discount od
     ,shipment ship
     ,mff_report.stage_complex_deal_head_hist scdhh  
    where od.deal_ID = (select deal_id from deal_XX) 

    and od.deal_id = scdhh.deal_id 
    and ship.status_code = 'R'
    and od.order_no = ship.order_no
    and ship.receive_date BETWEEN
        to_date(scdhh.start_invoice_date , 'YYYY-MM-DD" "HH24:MI:SS')
         AND
         to_date(scdhh.end_invoice_date , 'YYYY-MM-DD" "HH24:MI:SS') ;

【问题讨论】:

那么,select deal_id from deal_XX 单独运行时会返回多少行?你不想加入那个 CTE,而不是使用子查询吗? 大约 180 单的订单号是我所期望的。 【参考方案1】:

如果您运行 Q1:select deal_id from deal_XX,那么您可能会得到不止一行。因此,有两个问题:

    如果有select *, (subselect) from tableX,那么子选择必须始终为tableX 的每一行返回一个值。由于您将 Q1 作为子选择,因此您的查询失败。

    同样的问题是当你有select * from tableX X where X.y = (subselect)。同样,查询处理器希望您提供一个子选择,为TableX 的每一行返回一个值,并且您让 Q1 返回许多行。

解决方案取决于您要达到的目标。第二个问题可以使用od.deal_ID IN (select deal_id from deal_XX) 解决,这意味着您希望可以在deal_XX 返回的deal_ids 列表中找到deal_id 的行。

【讨论】:

以上是关于得到以下错误 ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01427: 单行子查询返回多行更新

Oracle APEX 交互式报告中的错误 - ORA-01427:单行子查询返回多于一行

ORA-01427: 单行子查询返回多于一行 ,,WHEN USING SELECT COUNT

ORA-01427 单行子查询返回多行 - 如何解决?

ORA-01427:单行子查询返回多个行

Oracle SQL:ORA-01427:单行子查询返回多于一行