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

+0

, что не помогает. как бы я изменил запрос? – user3586248

+0

попробуйте 't.version in' вместо' t.version = ' – Aramillo

ответ

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 
) 

Потому что, когда группа по и использовать мин, он возвращает все минимальные значения для каждой группы, поэтому я думаю, что вы следует использовать вместо 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 
)