2014-09-26 80 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 
)