问题描述
我尝试使用 With 子句插入另一个表。我可以从最终查询中返回 id,但主要目标是获取适配器的名称。
With AdapterName as (Select CONCAT('s',LTRIM(name,'s')::integer+1) as new_name
From adapter
Where adapter.name LIKE 's%'
Order by id desc
Limit 1),AdapterIns as (INSERT INTO adapter (create_date,name,tag) SELECT Now(),new_name,new_name From AdapterName RETURNING id,name)
INSERT INTO user_adapter (create_date,user_id,adapter_id)
Select Now(),1,AdapterIns.id
From AdapterIns
RETURNING adapter_id;
如何返回 AdapterIns.name 作为最终结果?
谢谢,
更新:我也尝试将adapter_id与原始表连接,但在最新的INSERT中出现以下错误:
Select adapter.name
From adapter
Join (With AdapterName as (Select CONCAT('s','s')::integer+1) as new_name
From adapter
Where adapter.name LIKE 's%'
Order by id desc
Limit 1),new_name From AdapterName RETURNING id)
INSERT INTO user_adapter (create_date,adapter_id)
Select Now(),AdapterIns.id
From AdapterIns
RETURNING adapter_id) temp on adapter.id = temp.adapter_id;
解决方法
你不能。 Postgres 只允许你返回被插入的列。
您可以使用 returning *
然后连接回原始表以获取名称。
将第二个插入语句也塑造成 CTE(下面我称之为 original_insert
)然后选择会有所帮助。
With AdapterName as (Select CONCAT('s',LTRIM(name,'s')::integer+1) as new_name
From adapter
Where adapter.name LIKE 's%'
Order by id desc
Limit 1),AdapterIns as (INSERT INTO adapter (create_date,name,tag) SELECT now(),new_name,new_name From AdapterName RETURNING id,name),original_insert as (
INSERT INTO user_adapter (create_date,user_id,adapter_id)
Select now(),1,AdapterIns.id
From AdapterIns
RETURNING adapter_id
)
SELECT oi.adapter_id,ai.name
FROM original_insert oi JOIN AdapterIns ai ON oi.adapter_id = ai.id;