ではなくサブクエリ式の中から選択するために、実際のサブクエリを使用します。
UPDATE user_stats s
SET ave_price = x.ave_price
FROM (
SELECT user_id
,avg(l.price) AS ave_price
FROM lengths l
JOIN user_sessions us ON us.session_id = l.session_id
WHERE l.product_type = 'car'
GROUP BY us.user_id
HAVING avg(l.price) IS NOT NULL
) x
WHERE x.user_id = s.user_id;
これも、速くなります。 あなたがテーブルuser_sessions
に存在するuser_id
の関連する割合を持っていますが、user_stats
で、次のクエリは速いかもしれない場合(一方で、両方のすべてのケースでも同じ結果):
UPDATE user_stats s
SET ave_price = x.ave_price
FROM (
SELECT user_id
,avg(l.price) AS ave_price
FROM lengths l
JOIN user_stats usr USING (user_id)
JOIN user_sessions us ON us.session_id = l.session_id
WHERE l.product_type = 'car'
GROUP BY us.user_id
HAVING avg(l.price) IS NOT NULL
) x
WHERE x.user_id = s.user_id;
のポイントを2番目のバージョンは、無関係な行を早期に除外することです。 (ややエレガントで読みやすい)CTEと書かれた 同じクエリ:
WITH x AS (
SELECT user_id
,avg(l.price) AS ave_price
FROM lengths l
JOIN user_stats usr USING (user_id)
JOIN user_sessions us ON us.session_id = l.session_id
WHERE l.product_type = 'car'
GROUP BY us.user_id
HAVING avg(l.price) IS NOT NULL
)
UPDATE user_stats s
SET ave_price = x.ave_price
FROM x
WHERE x.user_id = s.user_id;
は、CTEがSELECTクエリはPostgreSQL 8.4で導入された一方で、CTEは、データ変更コマンドのためにしたことを通知することのみintroduced with PostgreSQL 9.1:
この質問のための条項
重要で(INSERT/UPDATE/DELETE)データ変更コマンドを許可:PostgreSQLのバージョン番号? –
テーブル定義(少なくとも関連する列とPK/FK制約)を投稿してください。可能であれば、テストデータをテーブルに取り込むための小さなスクリプトを用意してください。 – tscho
@ErwinBrandstetter:あなたが探している機能を知りたいのですが。それはCTEなので、PostgreSQL 8.4は最小ですか? – tscho