提问人:Max1e 提问时间:10/31/2023 最后编辑:Max1e 更新时间:10/31/2023 访问量:63
Postgres 将数据联接到插入的生成的 ID 上
Postgres joining data onto inserted generated IDs
问:
在 postgres 中,我想在第一个表中插入多行,然后使用生成的身份将多行插入到第二个表中。有没有办法将返回的 ID 与我的数据联接?
我有以下代码片段,其中我首先将新的除数插入到插入的表中,然后使用这些生成的 ID 插入到除数表中。
WITH inserted AS (
INSERT INTO transaction (transaction_date, mutation)
SELECT transaction_date, mutation FROM new_dividends
RETURNING transaction_id
)
INSERT INTO dividend (transaction_id, effect)
SELECT transaction_id, effect FROM inserted;
这是行不通的,因为在第二个插入中,应从new_dividends中选择效果,因为它在返回语句中不存在。
编辑:transaction_id是在事务中生成的,因此它不是从new_dividends中选择的。因此,两个结果集之间没有共同的唯一列。
答:
0赞
Zegarek
10/31/2023
#1
您从 CTE 中进行选择的事实并不妨碍您使用所需的任何联接: 演示:
WITH inserted AS (
INSERT INTO transaction (transaction_date, mutation)
SELECT transaction_date, mutation FROM new_dividends
RETURNING transaction_id, transaction_date, mutation
)
INSERT INTO dividend (transaction_id, effect)
SELECT transaction_id, effect FROM inserted NATURAL JOIN new_dividends;
table "transaction";
transaction_id | transaction_date | 突变 |
---|---|---|
59B0F892-9C7B-4D00-B2C0-736169290221 | 2023-10-31 15:15:46.863376+00 | 突变1 |
table new_dividends;
transaction_date | 突变 | 影响 |
---|---|---|
2023-10-31 15:15:46.863376+00 | 突变1 | 效果1 |
table dividend;
transaction_id | 影响 |
---|---|
59B0F892-9C7B-4D00-B2C0-736169290221 | 效果1 |
评论
0赞
Zegarek
10/31/2023
通常应该为表添加别名,并指定哪一列来自哪一列。有了 ,它很清楚并共享 a,所以它们都有该列不会造成冲突,而且你已经说过不存在 - 所以也很清楚它应该来自 .如果它们有更多共同的列,则可能需要切换到常规列或具有显式联接条件的列。natural join
inserted
new_dividends
transaction_id
effect
inserted
new_dividends
inner
left join
0赞
Max1e
10/31/2023
我看到我在代码片段中犯了一个错误。Transaction_id 在 new_dividends 中不存在,因为它是在事务中生成的。所以我没有连接条件,因为结果集没有公共列。这样的事情还有可能吗?
0赞
Zegarek
10/31/2023
当然,这是有道理的。不过,这没什么区别:您可以返回共享的两列及其上的 CTE。我已经更新了其中的答案和演示链接natural join
inserted
评论
inserted
join