Обновление результата выбранного запроса? - PullRequest
0 голосов
/ 04 марта 2012

Я пытаюсь обновить определенные фрагменты данных на основе оператора выбора в триггере. Оператор выбора выглядит следующим образом:

SELECT col1 
FROM tbl1 d 
  LEFT OUTER JOIN tbl2 e ON D.colid = E.colid

Затем я хочу изменить данные, возвращаемые этим оператором, на новое значение, вычисленное в триггере. Я думал, что это может быть что-то вроде e.col1 = COUNTER, но это не похоже на работу. Любая помощь с обновлением этих данных была бы отличной, спасибо.

РЕДАКТИРОВАТЬ: я изменил запрос выбора, чтобы получить данные, которые я на самом деле хочу. Тот, который я изложил выше, был неправильным.

UPDATE tbl2 SET col1 = COUNTER
WHERE EXISTS(SELECT col1
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2);

Я должен еще раз заявить, что проблема при использовании приведенного выше кода заключается в том, что весь столбец в таблице обновляется в отличие от данных, возвращаемых запросом select.

EDIT: tbl1 содержит столбцы colid, col2 и

tbl2 содержит столбцы colid, col1

Триггер перед вставкой на tbl1.

Ответы [ 4 ]

1 голос
/ 04 марта 2012

Было бы полезно, если бы вы сказали нам, для какой таблицы активирован триггер, какой тип триггера и какие столбцы в какой таблице. Я до сих пор не могу понять, что вы пытаетесь сделать с этими обновлениями.

UPDATE tbl2 SET col1 = COUNTER
WHERE EXISTS(SELECT col1
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2);

Я думаю, проблема в том, что вы делаете LEFT JOIN в своем внутреннем утверждении select. Поскольку во внутреннем запросе всегда будет строка, и вы делаете это в предложении EXISTS, она всегда будет соответствовать строке, и ваш UPDATE будет запускаться для каждой строки в таблице.

Может быть, это будет работать лучше для вас:

UPDATE tbl2 SET col1 = COUNTER
WHERE EXISTS(SELECT col1
FROM tbl1 d 
    INNER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2);

Я скажу, что если этот триггер работает на tbl2, то это плохой способ сделать это, потому что вы, вероятно, столкнетесь с проблемой таблицы мутаций.

1 голос
/ 04 марта 2012

Один из вариантов - использование оператора MERGE с оператором WHEN MATCHED CLAUSE. Вот хороший пример: http://www.oracle -developer.net / display.php? Id = 203

0 голосов
/ 04 марта 2012

Меня немного смущает вопрос, но я думаю это может быть тем, что вы хотите:

UPDATE tbl2
SET    col1 = COUNTER
WHERE  EXISTS (
    SELECT *
    FROM   tbl1
    WHERE  tbl1.colid = tbl2.colid
    AND    tbl1.col2 = :new.col2);

Существует также (нестандартная) функция Oracle дляприменить UPDATE к столбцам выражения подзапроса .
На этих страницах показана функция .

Может работать для вас:

UPDATE (
    SELECT tbl2.col1
    FROM   tbl2
    JOIN   tbl1 USING (colid)
    WHERE  tbl1.col2 = :new.col2
    ) t
SET  tbl2.col1 = COUNTER;
0 голосов
/ 04 марта 2012

Поскольку вы используете псевдоним таблицы tbl2 в подзапросе, он обрабатывает ее как другую таблицу, не связанную с обновлением. Нет необходимости создавать объект, просто присоединитесь к таблице обновлений, и она будет обновляться только при наличии внутреннего объединения

[мой SQL Server не оракул, поэтому синтаксис может немного отличаться]

update tbl2  
set col1 = (COUNTER)
from tbl2 t2
where tbl2.colid = t2.colid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...