table members

id  name
-----------
1  satoyan
2  hoge

1と2でnameを入れ替えるような処理が必要になったのですが、一発のSQLで済ますように下記のようなSQLを書きました。
 
UPDATE members SET name = CASE
       WHEN id=1 THEN (SELECT name FROM members WHERE id=2)
       WHEN id=2 THEN (SELECT name FROM members WHERE id=1)
       ELSE name) END
WHERE id in (1,2);

PostgreSQLではOKでした。
MySqlでは
You can't specify target table 'members' for update in FROM clause 
でエラー。 
Sqliteはまあ、無視します。
多分、SqlServer,Oracleでは正常にいくのかな?
MySQLの方はselectを使わずに、直接値を指定すれば正常に動作しました。
ただしnameにユニーク制約がかかっているとMySQLではNGです。
以前はPostgreもNGだったようですが、今のバージョン(8.4?)はいけるようです。

このへんの違いをもうちょっと調べたい、、。