PostGresql: копировать данные из случайной строки другой таблицы

У меня есть две таблицы, stuff а также nonsense,

create table stuff(
    id serial primary key,
    details varchar,
    data varchar,
    more varchar
);
create table nonsense (
    id serial primary key,
    data varchar,
    more varchar
);

insert into stuff(details) values
    ('one'),('two'),('three'),('four'),('five'),('six');
insert into nonsense(data,more) values
    ('apple','accordion'),('banana','banjo'),('cherry','cor anglais');

Смотрите http://sqlfiddle.com/

Я хотел бы скопировать случайные значения из nonsense в stuff, Я могу сделать это для одного значения, используя ответ на мой предыдущий вопрос: SQL Server Копировать случайные данные из одной таблицы в другую:

update stuff
set data=(select data from nonsense where stuff.id=stuff.id
    order by random() limit 1);

Тем не менее, я хотел бы скопировать более одного значения (data а также more) из той же строки, и подзапрос не позволит мне сделать это, конечно.

Я Microsoft SQL, я могу использовать следующее:

update stuff
set data=sq.town,more=sq.state
from stuff s outer apply
    (select top 1 * from nonsense where s.id=s.id order by newid()) sq

Я читал, что PostGresql использует что-то вроде LEFT JOIN LATERAL вместо OUTER APPPLY, но простая замена не работает для меня.

Как я могу обновить несколько значений из случайной строки другой таблицы?

1 ответ

Начиная с Postgres 9.5, вы можете назначить несколько столбцов из подзапроса:

update stuff
set (data, more) = (
  select data, more
  from nonsense
  where stuff.id=stuff.id
  order by random()
  limit 1
);
Другие вопросы по тегам