2014-02-11 10 views
2

Я пытаюсь обновить столбец со счетчиком (+1) на основе столбца в одной и той же таблицы сопоставления, что другой, я попытался ниже:Oracle SQL Update набор

UPDATE table1 p 
    SET (p.f_dup_count)= ((p.f_dup_count) + 1) 
     WHERE (SELECT a.f, 
        p.f 
       FROM table2 a, 
        table1 p 
       WHERE a.f = p.f 
       AND a.a_id = p.a_id) 

Это в настоящее время приводит к :

Error at Command Line:28 Column:40 Error report: SQL Error: ORA-00936: missing expression 00936. 00000 - "missing expression" 
*Cause:  
*Action: 

очень полезным при условии, раствор для этого, как показано ниже:

UPDATE table1 SET р f_dup_count = (случай, когда существует (SELECT 1 ОТ таблица2 в ГДЕ a.f = p.f И a.a_id = p.a_id ) затем f_dup_count + 1 еще 0 конец);

Однако, теперь я проверил это, я понял, что время обработки довольно высокое. У меня есть способ сделать это как «создать таблицу как выбор», чтобы повысить производительность?

спасибо,

Адам

+0

где положение должно быть «где поле/состояние = поле/состояние» ... ваше утверждение здесь не хватает в = .. . где указано выражение select = = (или какое поле в таблице 1 равно полям в подзапросе). Если вы разделяете то, что вы пытаетесь выполнить, я уверен, что мы можем сделать переписку для вас. Боковое примечание ... лучше не хранить счеты самостоятельно в базе данных ... лучше иметь оператор, который запускает инкрементный счет на лету. – Twelfth

+0

Я предполагаю, что вы хотите предикат «EXITS», но сообщение об ошибке понятное и легко найти ответ по коду ошибки – jbaliuka

ответ

1

Я предполагаю, что дело в том, чтобы обновить DUP подсчета, когда соответствующая запись найдена в table2.

Если это так, вам нужно изменить подзапрос на коррелированный подзапрос, удалив ссылку на table1. Тогда, я предполагаю, что вы хотите, чтобы проверить наличие соответствующей записи в table2, которые вы можете сделать, используя exists:

UPDATE table1 p 
    SET f_dup_count = f_dup_count + 1 
    WHERE exists (SELECT 1 
        FROM table2 a 
        WHERE a.f = p.f AND 
         a.a_id = p.a_id 
       ); 

EDIT:

Если вы хотите увеличить или установить в 1, то вы можете использовать либо два обновления или переместить условие в case заявление:

UPDATE table1 p 
    SET f_dup_count = (case when exists (SELECT 1 
              FROM table2 a 
              WHERE a.f = p.f AND 
               a.a_id = p.a_id 
             ) 
          then f_dup_count + 1 
          else 0 
         end); 
+0

Это замечательно, спасибо за вашу помощь! – adzmet1

+0

Можно ли добавить в этот оператор ELSE SET f_dup_count = 0? – adzmet1

+0

Отлично! Еще раз спасибо! – adzmet1

0

где положение должно содержать условие, как where ID = 42. У вас есть только значение, например where 42. Oracle не знает, что делать с этим значением.

Один из способов решить вашу проблему в Oracle является обновлением подзапроса, как:

UPDATE (
     SELECT p.f_dup_count 
     FROM table2 a 
     JOIN table1 p 
     ON  a.f = p.f 
       AND a.a_id = p.a_id 
     ) SubQueryAlias 
SET  f_dup_count = f_dup_count + 1