2014-01-30 2 views
1

Я обновляю два столбца в таблице с именем «sample» со значениями 5, если эти условия удовлетворяют;Оператор Oracle Update с ошибкой ORA-00913

1) Если TABLE A.MEM_NBR = TABLE B.MEM_NBR AND TABLE B.M_ID = XXXX, AND TABLE B.CLCL = 1 и, наконец, используя условие соединения, как ТАБЛИЦА A.ID = SAMPLE.ID
2) Если эти условия не хватает, то нам не нужно обновлять таблицу.

Но я получаю сообщение об ошибке;

SQL Error: ORA-00913: too many values 
00913. 00000 - "too many values". 

Нужна помощь по вышеуказанному сценарию обновления, где я ошибаюсь.

Сценарий, который я использую, заключается в следующем:

UPDATE SAMPLE 
SET SAMPLE.PCB = 5, SAMPLE.PCBP_Q = 5 
WHERE (
    SELECT * 
    FROM MEMBER_A A,S_NEW B 
    WHERE A.MEM_NBR = B.MEM_NBR 
     AND B.M_ID = 1111 
     AND B.CLCL = 1 
     AND B.ID = C.ID); 

ответ

1

Проблема в том, что ваш подзапрос может возвращать более одного значения. Чтобы обойти эту проблему, вы можете использовать ключевое слово EXISTS. (Я также преобразовал соединение в синтаксис ANSI.)

UPDATE SAMPLE C 
SET C.PCB = 5, C.PCBP_Q = 5 
WHERE EXISTS (
    SELECT 1 
    FROM 
     MEMBER_A A 
     JOIN S_NEW B 
     ON A.MEM_NBR = B.MEM_NBR 
     AND B.M_ID = 1111 
     AND B.CLCL = 1 
    WHERE 
     A.ID = C.ID); 
+0

Просто сомнение, как это подзапрос связан с внешней таблицей ОБРАЗЦОМ ? Я думаю, что он обновит все записи в SAMPLE, если внутренний запрос имеет какой-либо результат. Поправьте меня, если я ошибаюсь. – San

+0

@San это прекрасно. Я предполагаю, что вы не уверены, что присоединение к UPDATE, как это, будет вести себя правильно. У меня было это тоже один раз .. обновление происходит на основе каждой строки в проверяемой проверке существует таблица подкатегорий. –

+0

@ Сан: Спасибо за ваш комментарий. Подзапрос и внешний запрос связаны в состоянии «A.ID = C.ID». (Это было неясно в коде OP, потому что псевдоним таблицы не был согласованным.) – bernie

0

Ваше местонахождение может быть неправильным. Это приводит к сопрягать много значений без отображения

Попробуйте как этого

UPDATE SAMPLE 
SET SAMPLE.PCB = 5, SAMPLE.PCBP_Q = 5 
WHERE ColumnNmae IN (
    SELECT ColumnName 
    FROM MEMBER_A A,S_NEW B 
    WHERE A.MEM_NBR = B.MEM_NBR 
     AND B.M_ID = 1111 
     AND B.CLCL = 1 
     AND B.ID = C.ID); 

Или использовать коррелированный подзапрос, как это:

UPDATE SAMPLE 
SET SAMPLE.PCB = 5, SAMPLE.PCBP_Q = 5 
WHERE EXISTS (
    SELECT 1 
    FROM MEMBER_A A,S_NEW B 
    WHERE A.MEM_NBR = B.MEM_NBR 
     AND B.M_ID = 1111 
     AND B.CLCL = 1 
     AND B.ID = C.ID 
     AND A.ColumnNmae = SAMPLE.ColumnNmaes); 
+0

Спасибо за быстрый ответ. Этот скрипт работает очень хорошо для меня. Добавляя к этому, у меня около 8 похожих (несколько разных сценариев обновлений), и я хочу запустить их все в один скрипт. Должен ли я использовать пакет/процедуру, чтобы все 8 подобных скриптов могли выполняться сразу? Пожалуйста, предложите мне, что и как это сделать. – user3251591

+0

Я использую тот же самый запрос, но на этот раз он должен обновить поля даты. Я использую этот запрос, но он не будет работать. Любые мысли или предположения о том, что здесь не так; 'ОБРАЗЕЦ ОБРАЗЦА C SET SAMPLE.C_DATE = TO_DATE ('01/01/2013', 'MM/DD/YYYY') и TO_DATE ('12/31/2013 ',' MM/DD/YYYY ') ГДЕ СУЩЕСТВУЕТ (SELECT * ОТ MEMBER_A А, В S_NEW ГДЕ A.MEM_NBR = B.MEM_NBR И B.M_ID В (1111,2222,3333) И A.L_TEST = TO_DATE ('01/01/2013' ,» MM/DD/YYYY ') и TO_DATE ('12/31/2013', 'MM/DD/YYYY') AND B.ID = C.ID); ' – user3251591

Смежные вопросы