2017-12-15 5 views
0

나는 다음과 같은 오류 얻고있다 "단일 행 서브 쿼리가 하나 개 이상의 행 반환"다음과 같은 오류 ORA-01427 얻기 : 단일 행 부질의 반환 둘 이상의 행 00000 01427. -

내가 싶어를 첫 번째 쿼리의 열 값 및 그 값을 다음 쿼리로 전달합니다.

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') ; 
+1

글쎄,'deal_XX에서 deal_id를 선택합니까? 하위 쿼리를 사용하는 대신 해당 CTE에 가입 하시겠습니까? –

+0

약 180 한 거래에 대한 주문 번호는 내가 예상하는 것입니다. –

답변

0

Q1 : select deal_id from deal_XX을 실행하면 두 개 이상의 행이 표시됩니다.

  1. select *, (subselect) from tableX을 갖는 다음 부속 선택이 tableX의 각 행에 대해 항상 하나 개의 값을 반환해야한다 : 따라서, 두 가지 문제가있다. subselect로 Q1이 있으 G로 조회가 실패합니다.

  2. 동일한 문제는 select * from tableX X where X.y = (subselect) 일 때 발생합니다. 다시 말하지만 쿼리 프로세서에서는 각 행에 대해 하나의 값만 반환하는 subselect를 TableX으로 제공하고 Q1이 많은 행을 반환하도록합니다.

해결 방법은 달성하려는 대상에 따라 다릅니다. 두 번째 문제는 od.deal_ID IN (select deal_id from deal_XX)을 사용하여 해결할 수 있습니다. deal_id의 목록에서 deal_id를 찾을 수있는 행을 찾으려면 deal_XX이 반환됩니다.