Это не совсем один запрос, но если ваша задача на самом деле просто избежать расовых условий / аномалий изоляции транзакций, возникающих из-за наивного подхода сделать это с несколькими запросами, то это должно сделать это:
-- assign tableA's future primary keys into a_id without
-- creating entries on tableA, pg_get_serial_sequence()
-- should retrieve tableA's primary key generator
UPDATE tableB
SET a_id = nextval(pg_get_serial_sequence('tableA', 'id'))
WHERE a_id IS NULL;
-- insert into tableB, with explicitly specified primary keys,
-- note that this doesn't increment tableA's sequence as that
-- has already been done in the previous operation by nextval()
INSERT INTO tableA(id, name)
SELECT a_id, name FROM tableB;
Обратите внимание, что вы все равно должны заключить это в транзакцию, чтобы гарантировать, что обновления tableB будут откатываться в случае сбоя вставки по какой-либо причине.В качестве альтернативы, поскольку две вышеописанные операции являются идемпотентными, их можно безопасно повторить одновременно даже без транзакции.