2017-08-08 4 views
0

私は、ユーザーが他のユーザーとアイテムを交換できるサイトで作業しています。貿易が完了すると、アイテムの所有者を変更する必要があります。2行の外部キーを切り替える

私の 'items'テーブルには、そのユーザーを参照する外部キーがあります。 2つのアイテムIDがある場合、どうすれば外部キーをお互いに切り替えることができますか?私はこのような何かを試してみた

...

UPDATE items 
SET user_id = (
    SELECT users.id FROM items 
    INNER JOIN users 
    ON users.id = items.user_id 
    WHERE items.id = $1 
) 
WHERE id = $2; 

UPDATE items 
SET user_id = (
    SELECT users.id FROM items 
    INNER JOIN users 
    ON users.id = items.user_id 
    WHERE items.id = $2 
) 
WHERE id = $1; 

これは最初のUPDATEが実行された後ので、USER_IDが更新されて動作しませんので、意図したように、第2のSELECT文では動作しません。

答えて

1

これを行うには、単一のクエリで、withステートメントを使用します。

pairsクエリは、アイテムとパラメータをパラメータとしてリンクし、リンクされた値を反対の順序で集約して切り替えます。

with params(param) as (
    values ($1), ($2) 
), 

pairs(i_id, u_id) as (
    select i_id, u_id 
    from (
     select 
      array_agg(param order by user_id) as i_arr, 
      array_agg(user_id order by user_id desc) as u_arr 
     from items 
     join params on param = id 
    ) s, 
    unnest(i_arr, u_arr) as u(i_id, u_id) 
) 

update items 
set user_id = u_id 
from pairs 
where id = i_id; 
+0

ありがとうございました。それは素晴らしい作品です!これは間違いなく私にいくつかの新しいコンセプトを公開しています。私は集合関数を読み、これがなぜ機能するのかを理解する必要があります。 – galaxy233

関連する問題