2014-09-26 76 views
0

我試圖運行更新查詢。
表PS_Z_TREND_NOW_TBL包含DESCR254和URLS列。
我正在使用PSPRSMDEFN,它有很多列,包括PORTAL_LABEL和URLS。我想運行下面的更新查詢來更新PS_Z_TREND_NOW_TBL.URLS列,其中值匹配PS_Z_TREND_NOW_TBL.DESCR254和PSPRSMDEFN.URLS。我需要在下面的查詢中進行更改/添加以完成此項工作?當我嘗試運行下面的查詢它給出了一個錯誤,指出,「單行子查詢返回多行」ORACLE SQL UPDATE問題

UPDATE PS_Z_TREND_NOW_TBL now 
SET now.URLS = t.URLS 
WHERE now.DESCR254 IN(
select t.PORTAL_URLTEXT from PSPRSMDEFN t, PS_Z_TREND_NOW_TBL trd 
where t.VERSION = 
(select MIN(t2.VERSION) 
    from PSPRSMDEFN t2 
    WHERE t2.PORTAL_LABEL = trd.DESCR254 
    AND t2.PORTAL_REFTYPE = 'C' 
    group by t2.PORTAL_LABEL 
) 
AND t.PORTAL_LABEL = trd.DESCR254 
    AND t.PORTAL_REFTYPE = 'C' 
    and t.PORTAL_NAME = 'EMPLOYEE' 
) 

這從上面返回多行數據查詢的一部分。它返回的值與PS_Z_TREND_NOW_TBL.DESCR254中的值相同。我想將這些值與查詢中返回的內容進行匹配以更新URLS字段。

select t.PORTAL_URLTEXT from PSPRSMDEFN t, PS_Z_TREND_NOW_TBL trd 
    where t.VERSION = 
    (select MIN(t2.VERSION) 
     from PSPRSMDEFN t2 
     WHERE t2.PORTAL_LABEL = trd.DESCR254 
     AND t2.PORTAL_REFTYPE = 'C' 
     group by t2.PORTAL_LABEL 
    ) 
    AND t.PORTAL_LABEL = trd.DESCR254 
     AND t.PORTAL_REFTYPE = 'C' 
     and t.PORTAL_NAME = 'EMPLOYEE' 
+0

這不是問題自我解釋嗎?在進行更新時,只能將行值設置爲單個值,而不是查詢返回的多個值。您需要創建邏輯以使底部選擇語句返回一行,而不是......您的問題與您的數據有關,代碼 – Twelfth 2014-09-26 18:18:59

+0

中的任何內容都沒有幫助。那麼我將如何更改查詢呢? – user3586248 2014-09-26 18:21:56

+0

嘗試't.version in'而不是't.version =' – Aramillo 2014-09-26 18:23:25

回答

1

我想查詢的這個部分是返回多行:

t.VERSION = 
(select MIN(t2.VERSION) 
    from PSPRSMDEFN t2 
    WHERE t2.PORTAL_LABEL = trd.DESCR254 
    AND t2.PORTAL_REFTYPE = 'C' 
    group by t2.PORTAL_LABEL 
) 

因爲當你GROUP BY和使用分鐘,它返回所有最小值爲一組,這就是爲什麼我想你應該使用in代替=

t.VERSION in 
    (select MIN(t2.VERSION) 
     from PSPRSMDEFN t2 
     WHERE t2.PORTAL_LABEL = trd.DESCR254 
     AND t2.PORTAL_REFTYPE = 'C' 
     group by t2.PORTAL_LABEL 
    ) 
1

下面就是答案。我使用了一個EXISTS子句:

UPDATE PS_Z_TREND_NOW_TBL now 
SET URLS = 

(select t.PORTAL_URLTEXT from PSPRSMDEFN t, PS_Z_TREND_NOW_TBL trd 
where t.VERSION = 
(select MIN(t2.VERSION) 
    from PSPRSMDEFN t2 
    WHERE t2.PORTAL_LABEL = trd.DESCR254 
    AND t2.PORTAL_REFTYPE = 'C' 
    group by t2.PORTAL_LABEL 
) 
AND t.PORTAL_LABEL = trd.DESCR254 
    AND t.PORTAL_REFTYPE = 'C' 
    and t.PORTAL_NAME = 'EMPLOYEE' 
    AND NOW.DESCR254 = T.PORTAL_LABEL 
) 

where Exists 
(select t.PORTAL_URLTEXT from PSPRSMDEFN t, PS_Z_TREND_NOW_TBL trd 
where t.VERSION = 
(select MIN(t2.VERSION) 
    from PSPRSMDEFN t2 
    WHERE t2.PORTAL_LABEL = trd.DESCR254 
    AND t2.PORTAL_REFTYPE = 'C' 
    group by t2.PORTAL_LABEL 
) 
AND t.PORTAL_LABEL = trd.DESCR254 
    AND t.PORTAL_REFTYPE = 'C' 
    and t.PORTAL_NAME = 'EMPLOYEE' 
    AND NOW.DESCR254 = T.PORTAL_LABEL 
)