2013-09-04 3 views
0

Могут строятся строки с колонками для таблицы.
я имел таблицу, в которой сумма должна была быть обновлена ​​для одного члена в течение 3-х разных летОбновление обоих строк и столбцов в оракуле

я использовал следующий запрос

update ahd 
    set amount1=(select a.amnt1 
        from ahd inner join ahdtmp a on ahd.member_key=a.member_key 
       where ahd.date1=a.date1 
        and a.status='FALSE' 
        and a.member_key in (select distinct member_key 
              from ahd)) 

Когда я выполнить этот

Ошибка в строке 2:
ORA-01427: однострочный подзапрос возвращает более одного ряда

Временная таблица ahdtmp

create table ahdtmp(
member_key number(10), 
date1 date, 
amnt1 number(10,2), 
amnt2 number(10,2), 
date_amend date, 
Status varchar2(10)); 

Пожалуйста, укажите на это?

Что может пойти не так ..

+1

Подзапрос, который у вас есть после 'set amount1 = ...', возвращает более одной строки, тогда как предполагается, что он должен вернуть одну или нулевую строку. Проверьте свой подзапрос и измените его так, чтобы он возвращал только одну строку. – Rachcha

ответ

1

Возможно, что вы хотите:

update ahd 
set amount1=(select a.amnt1 
       from ahdtmp a 
      where ahd.member_key=a.member_key and 
        ahd.date1  =a.date1 
       and a.status='FALSE') 
where member_key = 'some particlar member ey' 
+0

Но это будет обновлять все строки таблицы, помещая значения NULL, где подзапрос не находит совпадения. Правильно? Я вижу, что оператор OP будет делать то же самое (если он сработает), но я думаю, что он этого не хотел. –

+0

Хммм ... Лучше бы мне настроить ... –

1

Может быть, следующий сценарий будет полезен, это общий код (его только в качестве примера):

CREATE TABLE SOURCE(
    s_key int, 
    s_name varchar2(100)); 

CREATE TABLE TARGET(
    t_key int, 
    t_name varchar2(100)); 


INSERT INTO SOURCE VALUES(1,'A'); 
INSERT INTO SOURCE VALUES(2,'B'); 
INSERT INTO SOURCE VALUES(3,'C'); 
INSERT INTO SOURCE VALUES(4,'D'); 

INSERT INTO TARGET VALUES(1,'Z'); 
INSERT INTO TARGET VALUES(2,'Z'); 
INSERT INTO TARGET VALUES(3,'Z'); 
INSERT INTO TARGET VALUES(4,'Z'); 

/*HERE THE CODE*/ 
MERGE 
INTO target 
USING (
     SELECT s.s_name,s.s_key 
     FROM source s 
     ) 
ON  (t_key = s_key) 
WHEN MATCHED THEN 
UPDATE 
SET  t_name = s_name; 

Здесь ссылка для примера (отлично работает) sql fiddle.

Я не уверен, но ваш запрос будет что-то вроде этого:

MERGE 
INTO ahd 
USING (
     SELECT a.amnt1 
     FROM ahdtmp a 
     ) 
ON  (ahd.member_key=a.member_key) 
WHEN MATCHED THEN 
UPDATE 
SET  amount1 = amnt1 
WHERE ahd.status='FALSE' 
    AND ahd.member_key IN (SELECT DISTINCT member_key FROM ahd); 
1

Проблема здесь к югу запрос возвращает несколько значений. Вы должны отфильтровать его, чтобы вернуть одну запись.

update ahd 
set amount1=(select a.amnt1 
       from ahd inner join ahdtmp a on ahd.member_key=a.member_key 
      where ahd.date1=a.date1 
       and a.status='FALSE' 
       and a.member_key ='user_specific_key') 
Смежные вопросы