2015-05-19 126 views
0

我的查詢:更新命令: - ORA-01427: 「單行子查詢返回多個行」

update bl1_customer bl 
    set bl.CYCLE_CODE=(select c.BILL_CYCLE 
         from canba_bs3 c 
         inner join bl1_customer bl 
         on c.CUSTOMER_ID=bl.CUSTOMER_ID) 
    where exists (select c.BILL_CYCLE 
        from canba_bs3 c 
        inner join bl1_customer bl 
        on c.CUSTOMER_ID=bl.CUSTOMER_ID) and 
     bl.status='O'; 

update bl1_customer bl 
    set bl.CYCLE_CODE=(select c.BILL_CYCLE 
         from canba_bs3 c 
         inner join bl1_customer bl 
         on c.CUSTOMER_ID=bl.CUSTOMER_ID) 
    where exists (select c.BILL_CYCLE 
        from canba_bs3 c 
        inner join bl1_customer bl 
        on c.CUSTOMER_ID=bl.CUSTOMER_ID) and 
     bl.status='O'; 

錯誤:

ERROR at line 1: 
ORA-01427: single-row subquery returns more than one row 

請幫我解決這個問題

+0

兩個更新是相同的?或者我錯過了一個區別? – 1010

回答

0

您試圖執行包含返回多個行的SQL子查詢的SQL語句。 你應該檢查更新條件。嘗試將其作爲SELECT查詢運行並查看結果。

+0

我已經做了它,它已經返回了多個,但我用過也存在 –

+0

你確定這個結果限於一行: (從canba_bs3中選擇c.BILL_CYCLE)c內部連接b1_customer在c上.CUSTOMER_ID = bl.CUSTOMER_ID) – teoreda

+0

它返回多個 –

0

你得到的錯誤引發,因爲子查詢中的SET子句中,即

select c.BILL_CYCLE 
    from canba_bs3 c 
    inner join bl1_customer bl 
    on c.CUSTOMER_ID=bl.CUSTOMER_ID 

回報超過一排。

祝你好運。

0

您需要使用相關子查詢:

update bl1_customer bl 
set bl.CYCLE_CODE=(select c.BILL_CYCLE 
        from canba_bs3 c 
        where c.CUSTOMER_ID=bl.CUSTOMER_ID) 
where bl.status='O' 
AND EXISTS(  select 1 
        from canba_bs3 c 
        where c.CUSTOMER_ID=bl.CUSTOMER_ID); 

您還需要確保該表canba_bs3只包含每個客戶一行。

0

您正在使用與子查詢中的更新表和內部連接表相同的別名bl。當您使用該別名時,內部表格將具有優先權。

因此,子查詢與更新的行之間沒有限制,因此子查詢將返回每個更新行的所有值。

如果有至多一個BILL_CYCLE每個bl1_customer你可以修改你的更新是這樣的:

update bl1_customer bl 
    set bl.CYCLE_CODE=(select c.BILL_CYCLE 
         from canba_bs3 c 
         WHERE c.CUSTOMER_ID=bl.CUSTOMER_ID) 
WHERE EXISTS (SELECT 1 FROM canba_bs3 WHERE CUSTOMER_ID=bl.CUSTOMER_ID) 
     and bl.status='O'; 
0

OK,幾件事情要指出。

名稱範圍。在這兩種情況下,您的嵌套select都會包含對與主語句具有相同別名的同一表的引用。如果你認爲這將他們聯繫在一起,那麼你錯了。外部作用域中的「b1」別名在嵌套查詢中失去效力,因爲本地別名優先。因此,您給出的表述可以用英語解釋爲:

「更新bl1_customer表將週期代碼設置爲與客戶相關的所有周期的週期代碼,對於狀態爲0的每一行以及是否存在存在任何客戶的任何賬單週期記錄「

你想要做什麼,我會想象的是」用cycle_Code =將bl1_customer表更新爲canba_bs3中爲該客戶找到的cycle_code「。

問:如果在canba_bs3對於給定bl1_Customer沒有這樣的記錄,你更新cycle_code爲null該客戶

,因爲它並沒有回答這依然不能描述一個完整的解決方案嗎?或者在該領域留下任何預先存在的價值?

問題:如果canba_bs3中的某個給定bl1_Customer存在多個此類記錄,而您更新了cycle_code字段?

現在,如果我們假設每個customer_bl1在canba_b3中最多隻有一條記錄,那麼1010給出的答案是正確的。

但坦白地說,要求我們解決問題而不給我們陳述意圖坦率地說,是一種浪費的鍛鍊。

相關問題