Tenho a tarefa de inserir dados em algumas tabelas e retornar dados de sua interseção em uma consulta. As tabelas são vinculadas através de campos específicos ( solditems
refere-se a products
e invoices
, invoices
refere-se a customers
etc). O truque aqui é que id
in invoices
é definido automaticamente na inserção de linha. A consulta a seguir retorna um resultado vazio, a menos que eu remova JOIN
on invoices
. Se isso SELECT
for feito em uma consulta separada, tudo estará OK. O que está errado?
WITH newid AS (
INSERT INTO invoices (customer,idate)
VALUES (777,(SELECT now()::date))
RETURNING id
),
sold AS (
INSERT INTO solditems (invoiceid,prod,qty)
VALUES ((SELECT id FROM newid), 888, 1),
((SELECT id FROM newid), 999, 2)
RETURNING *
)
SELECT * FROM sold AS s
JOIN products AS p ON p.id=s.prod
JOIN invoices AS i ON i.id=s.invoiceid;
Como Akina explicou, todos os CTEs e a parte externa
SELECT
do mesmo comando veem o mesmo instantâneo da tabela, portanto, a nova linhaSELECT
ainda não está visível para o . Ver:Retorne tudo que você precisa na
RETURNING
cláusula:Você também ingressa em produtos para recuperar (supostamente uma) linha pré-existente de table
products
. Use umLEFT JOIN
lá ou você não receberá nada de volta se não houver nenhuma linha correspondente emproducts
. A menos que a integridade referencial seja imposta com restrições FK desold.prod
→products.id
, você obterá uma exceção para o ausenteproducts.id
e este ponto é discutível. (Mas não dói em nenhum caso.)Também repetido simplificado
SELECT
, onde você só precisa de um.