7

我有一个多对多之间的模型,并用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)中执行此操作?

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

4

3 回答 3

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

如果您应该有多行bar(根据您的描述,您不应该这样做),那么一行将被更新多次,结果是任意的。

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

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

于 2012-08-28T01:51:06.393 回答
4

您仍然可以在UPDATE语句中加入表,尝试

UPDATE  bar a
SET     foo_id = c.foo_id
FROM    (
            SELECT foo_id, bar_id
            FROM foo_bar
        ) c
WHERE   a.id = c.bar_id

或者简单地说

UPDATE  bar a
SET     foo_id = c.foo_id
FROM    foo_bar c
WHERE   a.id = c.bar_id
于 2012-08-28T01:52:31.440 回答
2

如果你真的有一个一对多的关系,那么对于给定的 bar 取哪个值 foo 并不重要——只有一个或者它们都是一样的。

您可以执行以下操作:

update bar
    set foo_id = (select max(foo_id) from foo_bar where foo_bar.bar_id = bar.id)

子查询将结果限制为单个值。

于 2012-08-28T01:50:30.403 回答