0

私の質問を見ていただきありがとうございます。同様の質問を見たことがありますが、同じ深さではありません。助けてください!

user_id と date_created を保持するテーブル内のすべての行を、user_id の最も低い date_created で更新したいと考えています。

次の選択により、更新したいすべての行が得られます。

select user_id, min(date_created) from mytable s1 where 
    (select count(1) from mytable s2 where 
        s1.user_id = s2.user_id group by s2.user_id) 
 > 1 group by user_id order by user_id;

この更新プログラムが機能することを期待していました。

update mytable set join_status = 1 where date_created = 
    (select min(date_created) from mytable s1 where 
        (select count(1) from simplepay_payment s2 where 
            s1.user_id = s2.user_id group by s2.user_id)
  > 1 group by user_id);

しかし、次のエラーが発生します。

ERROR:  more than one row returned by a subquery used as an expression

いくつかの異なる解決策を試しましたが、何も役に立たないようです。

誰かが私から何かアイデアを持っていますか?

再度、感謝します。

4

1 に答える 1

3

SQL を次のように変更します。

update mytable set join_status = 1 where date_created IN
    (select min(date_created) from mytable s1 where 
        (select count(1) from simplepay_payment s2 where 
            s1.user_id = s2.user_id group by s2.user_id)
  > 1 group by user_id);

行比較の詳細については、ドキュメントを参照してください。


編集:

実行しているサブクエリでGROUP BY user_id. これは、テーブル内の一意の user_id 値の数に基づいて、多くの行simplepay_payment受け取ることを意味します。

クエリを期待どおりに機能させるには、2 つの列を使用して結合する必要があります:user_iddate_created. 既に述べたように、正しい結果を提供するクエリが既にあるので、次のように使用できます。

WITH desired AS (
  SELECT user_id, min(date_created) AS mindt
    FROM mytable s1 where 
      (SELECT count(1) FROM mytable s2
        WHERE s1.user_id = s2.user_id GROUP BY s2.user_id) > 1
   GROUP BY user_id)
UPDATE mytable m SET join_status = 1 FROM desired d
 WHERE d.user_id = m.user_id AND d.mindt = m.date_created;

クエリをCommon Table ExpressionUPDATEにラップし、ステートメントで使用しました。クエリの最後に追加RETURNING m.*して、更新された行とその新しい値を確認できます。

このクエリはSQL Fiddleでテストできます。


EDIT2:

バージョン 9.1 より前のUPDATEステートメントでは、共通テーブル式 (WITH クエリ) を使用できません。次のように、CTE サブクエリを更新に移動するだけです。

UPDATE mytable m SET join_status = 1 FROM (
  SELECT user_id, min(date_created) AS mindt
    FROM mytable s1 where 
      (SELECT count(1) FROM mytable s2
        WHERE s1.user_id = s2.user_id GROUP BY s2.user_id) > 1
   GROUP BY user_id) d
 WHERE d.user_id = m.user_id AND d.mindt = m.date_created;
于 2012-05-16T19:26:16.567 に答える