Oracle соотносит ОБНОВЛЕНИЕ - PullRequest
       4

Oracle соотносит ОБНОВЛЕНИЕ

3 голосов
/ 18 августа 2011

У меня проблемы с синтаксисом Oracle 10g для коррелированного обновления. Я обрабатываю этот код в процедуре PL / SQL.

Я бы подошел к проблеме в SQL Server так:

UPDATE  table_a a
SET     a.prov_id=pn.prov_id,
        a.step=1
from    (
          SELECT  p.prov_id
          FROM    note n
          INNER JOIN provider p ON n.author_id=p.user_id
          where   n.enc_id=a.enc_id
          AND     TRUNC(n.note_time)=a.attr_date
        ) pn

Эквивалентный синтаксис Oracle:

UPDATE  table_a a
SET     a.prov_id=(
          SELECT  p.prov_id
          FROM    note n
          INNER JOIN provider p ON n.author_id=p.user_id
          where   n.enc_id=a.enc_id
          AND     TRUNC(n.note_time)=a.attr_date
        ),
        a.step=1
WHERE EXISTS (
          SELECT  *
          FROM    note n
          INNER JOIN provider p ON n.author_id=p.user_id
          where   n.enc_id=a.enc_id
          AND     TRUNC(n.note_time)=a.attr_date
        )

Это фактически запускает подзапрос дважды? Есть ли более сокращенный синтаксис, чем этот?

1 Ответ

5 голосов
/ 19 августа 2011

Что касается того, выполняется ли подзапрос дважды, используйте EXPLAIN PLAN.

Мне нравится использовать команду слияния вместо обновления для этих связанных обновлений, что-то вроде: (Не проверено, если вы хотите проверитьответьте, пожалуйста, укажите DDL и вставьте операторы.)

merge into table_a TRGT
using (select P.prov_id, N.enc_id, trunc(n.note_time) as trunc_note_time
    from note N
    inner join provider P ON N.author_id=P.user_id) SRC
on (TRGT.enc_id = SRC.enc_id and TRGT.attr_date = SRC.trunc_note_time)
when matched then update set prov_id = SRC.prov_id
    , step = 1

Иногда вы можете обновить встроенное представление, например:

update (select A.prov_id, A.step, P.prov_id as p_prov_id
    from note N
    inner join provider P on N.author_id=p.user_id
    inner join table_a A 
        on N.enc_id=A.enc_id
        and trunc(N.note_time)=A.attr_date)
set prov_id = p_prov_id
    , step = 1

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

...