Это, вероятно, очень простой, но я не знаю, что искать.

Table1:

someid value
1      0
2      0
3      0

Table2:

someid value
9      1
10     2
11     3

Я хочу обновить Table1.value значениями Table2.value строка за строкой, без общего ключа, без условия where, только table1.value row1 = table2.value row1 и т. Д. Как горизонтальное объединение.

Итак, Таблица1 должна быть:

someid value
1      1
2      2
3      3

Я пытаюсь:

update table1
set value = table2.value
from table2

Но все значения из первой строки в table2:

1   1
2   1
3   1
1
BERA 16 Июл 2019 в 19:12

2 ответа

Лучший ответ

Вы можете использовать row_number():

update table1 
set value = t2.value
from (
  select id, value, row_number() OVER (ORDER BY id) AS n from table1
) t inner join (
  select id, value, row_number() OVER (ORDER BY id) AS n from table2
) t2 on t.n = t2.n
where t.id = table1.id

См. демонстрацию.
Результаты для таблицы 1:

> id | value
> -: | ----:
>  1 |     1
>  2 |     2
>  3 |     3

Если вы уверены, что идентификаторы в table1 являются последовательными без пробелов и начинаются с 1, запрос можно упростить следующим образом:

update table1 
set value = t2.value
from (
  select id, value, row_number() OVER (ORDER BY id) AS n from table2
) t2 
where t2.n = table1.id

См. демонстрацию.

1
forpas 16 Июл 2019 в 17:16

Вы можете попробовать следующий оператор sql с аналитической функцией окна row_number():

with t as
( 
 select row_number() over (order by someid) as someid,
        value
   from table2
)
update table1 t1
   set value = t.value
  from t
 where t1.someid = t.someid
returning t.*;

someid  value
1       1
2       2
3       2

Эти возвращаемые значения взяты из table1

Демо

1
Barbaros Özhan 16 Июл 2019 в 16:32