Com a tabela assim :
CREATE TABLE test_1 (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY
);
CREATE TABLE test_2 (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY
);
CREATE TABLE test_refs (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
id_1 bigint NOT NULL REFERENCES test_1,
id_2 bigint NOT NULL REFERENCES test_2
);
E a consulta de inserção assim:
WITH new_test_1_rows AS (
INSERT INTO test_1
DEFAULT VALUES
RETURNING *
), new_test_2_rows AS (
INSERT INTO test_2
DEFAULT VALUES
RETURNING *
), test_row_pairs AS (
INSERT INTO test_refs
( id_1, id_2 )
VALUES
(
(SELECT id FROM new_test_1_rows),
(SELECT id FROM new_test_1_rows)
)
RETURNING *
)
SELECT *
FROM test_row_pairs
Basicamente o que ele faz:
- insere uma linha em
test_1
- insere uma linha em
test_2
- insere seu par de IDs em
test_refs
O problema é que eu gostaria de reescrever a consulta em uma consulta multi-inserção, ou seja, para as n
linhas inseridas em test_1
inserir as n
linhas test_2
e, em seguida, criar as n
linhas test_refs
para os valores inseridos. Para isso eu preciso saber o índice de linha dentro do CTE, para que possa ser usado como uma chave de junção. É algo que você pode fazer dentro da RETURNING
cláusula?
Não há provisão para adicionar números de linha na
RETURNING
cláusula - nenhum equivalente paraWITH ORDINALITY
isso pode ser usado com funções de retorno de conjunto. Ver:E se você adicionar uma função de janela (como você pode ter tentado), você obtém:
A sintaxe específica do Postgres
ROWS FROM
pode retornar linhas na etapa de bloqueio, mas isso também é apenas para funções de retorno de conjunto. Ver:Você deve pegar o caminho mais longo para casa e gerar números de linha em outra CTE ou subconsulta. Exemplo com duas linhas:
db<>fique aqui