Jac*_*las 17 postgresql postgresql-9.6
这是我的实际问题的一个最小示例:
create table t(id serial primary key, rnd double precision);
Run Code Online (Sandbox Code Playgroud)
当然,您可以使用returning子句返回插入的列:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
Run Code Online (Sandbox Code Playgroud)
你也可以返回一个文字:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *, 1.0 dummy;
/*
| ID | RND | DUMMY |
|----|----------------|-------|
| 11 | 0.594980469905 | 1 |
*/
Run Code Online (Sandbox Code Playgroud)
但您不能返回源列:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *, w.rnd;
/*
ERROR: missing FROM-clause entry for table "w": with w as (insert into t(rnd) values(random()) returning *) insert into t(rnd) select random() from w returning *, w.rnd
*/
Run Code Online (Sandbox Code Playgroud)
有什么办法可以摆脱w.rnd最后的returning条款吗?
db<>在这里摆弄
dez*_*zso 15
关于该RETURNING条款的文件说:
插入每一行后由 INSERT 命令计算和返回的表达式。该表达式可以使用由 table_name 命名的表的任何列名。写入 * 以返回插入行的所有列。
这显然不适用于其他表中的列。
虽然我并没有真正理解问题的重点(即你为什么这样做 - 我想这是因为它是原始版本的一个太抽象的版本),一个可能的解决方案可能是:
WITH w AS (INSERT INTO t(rnd) VALUES (random()) RETURNING *),
x AS (INSERT INTO t(rnd) SELECT random() FROM w RETURNING *)
SELECT w.rnd, x.rnd
FROM w, x;
Run Code Online (Sandbox Code Playgroud)
也就是说,您可以将多个可写 CTE 放在查询的开头。请在dbfiddle上查看此操作。
| 归档时间: |
|
| 查看次数: |
9600 次 |
| 最近记录: |