Oracle SQL - Обновление данных столбца с помощью оператора МИНУС

0

Вопрос

У меня есть этот sql-запрос

(select x.a, x.b, x.c, x.d
from tableX x
where x.a IS NOT NULL
minus 
select y.a, y.b, y.c, y.d
from tableY y);

Приведенный выше запрос возвращает мне все данные TableX, которые отличаются от tableY. Возвращается несколько кортежей

Доказательства:

Когда я выполняю вышеуказанный запрос, я получаю этот результат:

a b c
1 43 65
2 66 333

Когда я выбираю данные из таблицы, я получаю это:

a b c
1 54 65
2 88 567

Данные таблицы являются правильными данными, поэтому я хочу обновить все кортежи, возвращенные из первого запроса(с предложением МИНУС), данными из таблицы.

Ожидаемый результат после предложения update, когда я выбираю данные из TableX, должен быть:

a b c
1 54 65
2 88 567

Каков наиболее эффективный способ выполнить это предложение об ОБНОВЛЕНИИ?

oracle plsql sql
2021-11-23 19:18:31
2

Лучший ответ

1

В oracle я нахожу синтаксис СЛИЯНИЯ гораздо более удобным, чем синтаксис ОБНОВЛЕНИЯ...

MERGE INTO
  tablex   x
USING
  tabley   y
    ON (y.a = x.a)
WHEN MATCHED THEN UPDATE
  SET
    x.b = y.b,
    x.c = y.c
  WHERE
    LNNVL(x.b = y.b)
    OR
    LNNVL(x.c = y.c)

Изменить: добавлено предложение where, чтобы избежать избыточных обновлений, следуя комментарию ниже.

2021-11-23 20:50:15

Включены ли строки, в которых x.b = y.b и x.c = y.c, в транзакцию?
jarlh

@jarlh Добавил предложение where в WHEN MATCHED чтобы избежать этого сценария.
MatBailie

это решение решило мой вопрос, спасибо
jct
0
update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley where tabley.a = tablex.a);

Чтобы уменьшить размер транзакции, добавьте xb <> yb или xc <><> yc:

update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley
              where tabley.a = tablex.a
                and (LNNVL(tabley.b = tablex.b) or LNNVL(tabley.c = tablex.c)));
2021-11-23 20:39:46

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................