一尘不染

在PostgreSQL中将多对多关系转换为一对多

sql

我有许多一对多之间foobar建模为表foo_barfoo_idbar_id

我现在想将其建模为一对多(我的数据允许)。

我已经添加了一个foo_id列,bar但是现在我想迁移数据。所以,我想

UPDATE bar SET foo_id = f where id = b;

每个fb一对来自哪里

SELECT foo_id AS f, bar_id AS b FROM foo_bar;

是否可以在SQL(特别是PostgreSQL 9.0)中执行此操作?

我知道只有一个值时如何在UPDATEs中执行子选择,但是在这种情况下很难做到这一点。


阅读 135

收藏
2021-05-23

共1个答案

一尘不染

UPDATE bar b
SET    foo_id = fb.foo_id
FROM   foo_bar fb
WHERE  fb.bar_id = b.bar_id;

如果您应该为一行添加多行bar(根据您的描述,您不应该这样做),则该行将被更新多次,并且结果是任意的。

这种形式的查询通常比相关子查询执行得更好。

请注意,bar应该真正命名的主键bar_id-我在查询中使用该名称。

2021-05-23