我的任务是将数据插入到几个表中,并在一个查询中从它们的交集返回数据。这些表通过特定字段链接(solditems
指products
和invoices
、invoices
指customers
等)。这里的技巧是id
ininvoices
是在行插入时自动设置的。以下查询返回空结果,除非我删除JOIN
on invoices
。如果SELECT
在单独的查询中完成,则一切正常。怎么了?
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;
就像Akina解释的那样,所有 CTE 和同一命令的外部
SELECT
都会看到表的相同快照,因此新行对 来说还不可见SELECT
。看:返回子句中所需的所有内容
RETURNING
:您还可以加入产品以从表中检索(假设一个)预先存在的行
products
。使用 aLEFT JOIN
,否则如果 中没有匹配的行,您将什么也得不到products
。sold.prod
除非使用来自→的 FK 约束强制执行参照完整性products.id
,否则您会得到缺失的异常products.id
,而这一点没有实际意义。(不过无论如何都不会造成伤害。)还简化了重复
SELECT
,您只需要一个。