返回PostgreSQL中插入的行

返回PostgreSQL中插入的行,postgresql,Postgresql,我目前正在开发一个报告生成servlet,它将来自多个表的信息聚合在一起并生成一个报告。除了返回结果行之外,我还将它们存储到一个reports表中,这样以后就不需要重新生成它们,如果从中提取它们的表被删除,它们将保持不变。为了实现后者,我有一个如下形式的语句(NB:x是外部生成的,在这个语句中实际上是一个常量): 这很好,但是我需要第二个查询来实际返回结果行,例如 SELECT col_a, col_b, col_c FROM reports WHERE report_id = x 这很好,因

我目前正在开发一个报告生成servlet,它将来自多个表的信息聚合在一起并生成一个报告。除了返回结果行之外,我还将它们存储到一个reports表中,这样以后就不需要重新生成它们,如果从中提取它们的表被删除,它们将保持不变。为了实现后者,我有一个如下形式的语句(NB:x是外部生成的,在这个语句中实际上是一个常量):

这很好,但是我需要第二个查询来实际返回结果行,例如

SELECT col_a, col_b, col_c
FROM reports
WHERE report_id = x

这很好,因为它只涉及一个表,不应该很昂贵,但似乎我应该能够直接返回插入的结果,避免第二个查询。有没有一些语法我找不到?(我应该注意,我在DB工作方面是相当新的,因此如果正确的答案是只运行第二个查询,因为它只是稍微慢一点,就这样吧)

在版本>=8.2的PostgreSQL中,您可以使用以下结构:

INSERT INTO reports (report_id, col_a, col_b, col_c)
SELECT x as report_id, foo.a, bar.b, bar.c
FROM foo, bar
RETURNING col_a, col_b, col_c

您也可以使用SRF,尽管这可能有些过分。这取决于你想做什么。例如,如果您只是返回信息以执行一段逻辑,该逻辑将直接返回数据库以执行更多查询,那么使用SRF可能是有意义的

或不选择:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

+1对于一个可靠的答案和(也)提到版本要求(尽管大多数人现在至少应该在8.3上),我相信Op要求返回整行,这将是
返回*
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;