sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでテーブルの列を別のテーブルの列で更新​​します

    UPDATE クエリは次のようになります:

    UPDATE table2 t2
    SET    val2 = t1.val1
    FROM   table1 t1
    WHERE  t2.table2_id = t1.table2_id
    AND    t2.val2 IS DISTINCT FROM t1.val1;  -- optional, see below
    

    あなたがそれを持っていたように、2つのテーブルの個々の行の間にリンクはありませんでした。すべての行はtable1からフェッチされます table2のすべての行に対して 。この場所のサブクエリ式は単一の値のみを返すことが許可されているため、これは(コストのかかる方法で)意味がなく、構文エラーも引き起こしました。

    table2_idの2つのテーブルを結合することでこれを修正しました 。それを実際に2つをリンクするものに置き換えてください。

    UPDATEを書き直しました table1に参加するには (FROMを使用 句)相関サブクエリを実行する代わりに、通常は桁違いに高速であるため。
    また、table2.val2を防止します。 table1に一致する行が見つからない場合は、無効になります。 。代わりに、何も この形式のクエリでは、このような行に発生します。

    FROMにテーブル式を追加できます プレーンなSELECTのようなリスト (テーブル、サブクエリ、セットを返す関数、...)。マニュアル:

    from_list

    他のテーブルの列をWHEREに表示できるようにするテーブル式のリスト 条件と更新式。これは、FROMで指定できるテーブルのリストに似ています。 SELECTの句 声明。ターゲットテーブルはfrom_listに表示されてはならないことに注意してください 、自己参加を意図していない限り(この場合、 from_listにエイリアスを付けて表示する必要があります)

    最後のWHERE 句は何も変更しない更新を防ぎます-これは実際には常に良い考えです(ほぼ全額の費用がかかりますが、利益はなく、エキゾチックな例外が適用されます)。古い値と新しい値の両方がNOT NULLであることが保証されている場合 、次のように簡略化します:

    AND   t2.val2 <> t1.val1
    
    • 複数の列でDISTINCTを選択するにはどうすればよいですか(またはできますか?


    1. c#を使用したSQLServer挿入コマンドからの戻り値

    2. SQLServerで複数の行を1つのコンマ区切り値に

    3. サンプルDWデータベースAdventureWorksDW2019の復元

    4. SQLite Intersect