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

PostgreSQL:CTEの行を更新する方法

    with cte as(
    select ....... from aTable
    ),update_cte as(
    update cte set aField=(select somthing from cte1)
    )
    

    それはできません。

    UPDATE CTEが具体化されているため、PostgreSQLでCTE用語を参照しない場合があります。それらは、基礎となるデータの単なるビューではありません。 (それは時々本当に迷惑ですが、それはそうです)

    次のことができます:

    CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
    
    UPDATE someview SET afield = ...
    

    お望みならば;これは、自動的に更新可能なビューをサポートする新しいPostgreSQLバージョンで機能します。 9.2はそうだと思います。

    それ以外の場合は、次のようなものが必要だと思います:

    WITH cte1 as (
      select ..... from bTable inner join cte using(anID)
    )
    update aTable 
    set aField=(select somthing from cte1)
    WHERE ... where clause from cte ...
    RETURNING *;
    

    しかし、実際には、しないでください CTE用語をcteと呼びます 、cte1 など。それらが何であるかを示す、有用でわかりやすい名前を付けます。これは、aという名前の変数でいっぱいのプログラムのようなものです。 xを介して ...あなたのコードを維持しなければならない次の人、またはあなたが助けを求める人は、しません。 いいね。




    1. SQL Server 2008 のインテリセンスの問題

    2. SQLiteを持っている

    3. Laravel4の挿入クエリストアドプロシージャでパラメータを渡す

    4. Hibernateを使用した単一列(クラス属性)の遅延フェッチ