2014-01-13 57 views
2

我有一個Oracle SQL查詢的投擲的錯誤:識別單行子查詢的錯誤

ORA-01427: single-row subquery returns more than one row 
01427. 00000 - "single-row subquery returns more than one row" 
*Cause:  
*Action: 

我能做些什麼來避免這個錯誤?我能做些什麼來確定此錯誤的原因/來源?

這裏的SQL查詢:

select (select CID 
      from SPL A 
      where A.prodid = appl.prod_id 
        and A.STATUS = 'SET' 
        and A.DT = (select min(DT) from SPL B where A.prodid = B.prodid)) 
      as CIDORIG 
    from prod_master appl 
    where prod_status = 'OFF'; 

不過,我不能在我的SQL語句來找到這樣一個子查詢。 MIN()只返回一個結果。我也嘗試用關鍵字IN替換'='符號,但沒有任何運氣。此查詢適用於其他prod_status值。

它在拋出錯誤之前從我們期望的15,648行中提取了13,700行。我預計有15,648行,因爲SQL Developer被配置爲一次只返回50行。當我選擇「計數行」選項時,它給了我15,648的數字。

SPL和prod_master都是視圖。

回答

3

據推測,返回多行子查詢:

 (select CID 
     from SPL A 
     where A.prodid = appl.prod_id 
       and A.STATUS = 'SET' 
       and A.DT = (select min(DT) from SPL B where A.prodid = B.prodid) 
    ) as CIDORIG 

要解決這個問題,儘量選用min(CID)max(CID)

0

只有當您確定您的子查詢將返回1行或0行時才使用標量子查詢,否則您將最終出現此錯誤。

你可以寫你查詢,而無需使用標量子查詢,如下所示

select a.CID 
    from prod_master appl 
     join SPL A 
     on (A.prodid = appl.prod_id) 
    where appl.prod_status = 'OFF' 
    and A.STATUS = 'SET' 
    and A.DT = (select min(b.DT) 
        from SPL B 
       where A.prodid = B.prodid);