7

私は多対多の間にfooあり、とを使用しbarてテーブルとしてモデル化されています。foo_barfoo_idbar_id

これを1対多としてモデル化したいと思います(私のデータでは可能です)。

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)でこれを行うことは可能ですか?

値が1つしかない場合に、UPDATEでサブSELECTを実行する方法を知っていますが、この場合は実行方法に困惑しました。

4

3 に答える 3

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

1つに複数の行が必要な場合bar(説明によれば、そうすべきではありません)、1つの行は複数回更新され、結果は任意です。

この形式のクエリは、通常、相関サブクエリよりも優れたパフォーマンスを発揮します。

の主キーに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

あなたが本当に1対多の関係を持っているなら、あなたが与えられたバーのためにどのfooの値を取るかは問題ではありません-1つだけであるか、それらはすべて同じです。

次のことができます。

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 に答える