обновить tbl_1 установить tbl_1.valueA = tbl2.valueB, когда tbl_2.value C равно tbl_1valueD - PullRequest
0 голосов
/ 26 апреля 2020

Как видно из заголовка - я пытаюсь обновить table.value другим table.value на основе общего значения в 2 таблицах (но не с одинаковыми именами столбцов)

Сначала я удаляю любые дубликаты записи в исходной таблице. И посчитайте оставшиеся строки - это итоговое значение 93.

Select rowid, xfmid_value from w_valve_reftest;
Delete from w_valve_reftest a
where rowid> (select min(rowid)
from w_valve_reftest b where b.xfmid_value=a.XFMID_VALUE);
Select count(*) from w_valve_reftest;

Далее я хочу обновить target.reference_1 значением из source.ref1_value и target.reference_2 с source.ref2_value где source.xfmid_value = target .xfm_id

Вот что у меня есть, но по какой-то причине обновляется более 17 000 записей. Вместо 93 я ожидаю.

update w_isolationvalve
set w_isolationvalve.reference_1=(select ref1_value from w_valve_reftest where w_isolationvalve.xfm_id=w_valve_reftest.xfmid_value);

update W_isolationvalve
set w_isolationvalve.reference_2=(select ref2_value from w_valve_reftest where w_isolationvalve.xfm_id=w_valve_reftest.xfmid_value);

Я не эксперт, но уже не ладья ie. Я взломал это далеко с помощью Google. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 26 апреля 2020

Ваш второй запрос должен быть:

update a
set reference_1=b.ref1_value,
refrence_2=b.ref2_value 
FROM w_isolationvalve a
JOIN w_valve_reftest b ON a.xfm_id=b.xfmid_value

Что касается количества обновлений, оно будет только 93, только если xfm_id и xfmid_value уникальны.

Также будьте осторожны с недетерминированностью c обновления. Если ваш выбор будет иметь несколько результатов для вашего условия объединения, обновление будет выполнено один раз для каждого из нескольких результатов, и вы не будете знать, что у вас получится.

Это должно работать в Oracle:

MERGE INTO w_isolationvalve  a
USING
(
SELECT * FROM w_valve_reftest 
)b
ON(a.xfm_id = b.xfmid_value)
WHEN MATCHED THEN UPDATE SET
a.reference_1 = b.ref1_value,
a.refrence_2 = b.ref2_value ;

Так как вы не любите слияния. Я думаю, что это также должно работать в Oracle:

UPDATE 
(SELECT a.reference_1, a.refrence_2, b.ref1_value , b.ref2_value
 FROM w_isolationvalve  a
 INNER JOIN w_valve_reftest b
 ON a.xfm_id = b.xfmid_value
) t
SET t.reference_1  = t.ref1_value ,
t.refrence_2 =t.ref2_value 
...