2012-03-28 15 views
0
mysql> SELECT Ext, Pass, Name, Context FROM temp_Users WHERE temp_Users.Pass NOT IN (SELECT Pass FROM Users); 
+------+-------+---------+------------+ 
| Ext | Pass | Name | Context | 
+------+-------+---------+------------+ 
| 6003 | Hello | WebPone | DLPN_Admin | 
+------+-------+---------+------------+ 
1 row in set (0.00 sec) 


mysql> UPDATE Users 
    -> SET (Pass, Name, Context) = (SELECT Pass, Name, Context FROM temp_Users WHERE temp_Users.Pass NOT IN (SELECT Pass FROM Users)) 
    -> WHERE Users.Ext = temp.Ext; 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(Pass, Name, Context) = (SELECT Pass, Name, Context FROM temp_Users WHERE temp_' at line 2 

私は選択結果からデータベースを更新したいと思います。このエラーが発生しています。どうすれば解決できるのか教えてください。私のデータベースをSelect resultから選択してください

+2

失礼ではないことが、しかし、あなたの試みは似ても似つかなかった:私はあなたがこのような何かをしたいと思います。実際の構文が何であるかをチェックするのではなく、構文が欲しいと思ったものを書いたようです(http://dev.mysql.com/doc/refman/5.0/en/update.html)... –

+1

@MichaelFredrickson:すべての公平さには、OPのような構文をサポートするDBMSがいくつかあります。彼が "MySQL"アップデートステートメントではなく "SQL"アップデートステートメントでグーグルグーグルを行った場合、彼はそのようなもので終わったはずです。 (異なるSQL方言がどのように異なっているかは誰もが知っているわけではない) – ruakh

+0

@ruakh面白い。私の好奇心のために、どのSQL方言が許すのか知っていますか? –

答えて

3

UPDATEの文では、SET (multiple_fields) = (subquery_that_returns_multiple_fields)の構文はサポートされていません。代わりに、 "複数テーブル"更新(結合)を使用する必要があります。 http://dev.mysql.com/doc/refman/5.6/en/update.htmlを参照してください。

ご質問には他にもいくつかの問題がありますので、に正確にはの内容を明記していません。 。 。

UPDATE users 
    JOIN temp_users 
    ON temp_users.ext = users.ext 
    SET users.pass = temp_users.pass, 
     users.name = temp_users.name, 
     users.context = temp_users.context 
WHERE temp_users.pass NOT IN 
     -- extra subquery to bypass MySQL limitation: 
     (SELECT pass 
      FROM (SELECT pass 
        FROM users 
       ) t 
     ) 
; 
+0

+1 @ruakh、あなたは両方の数が正しかったです...左側に接頭辞を付ける必要があります。そうでなければ、あいまいであると告げるので、 'IN'のために余分な副問い合わせを追加する必要があります。 –

+0

@ruakhありがとう、あなたの答えは私の仕事でした:) –

+0

@ArhamAliQureshi:ようこそ! – ruakh

2
UPDATE Users u 
JOIN temp_Users tu ON tu.Ext = u.Ext 
SET 
    Pass = tu.Pass, 
    Name = tu.Name, 
    Context = tu.Context 
WHERE tu.Pass NOT IN (
    SELECT Pass 
    FROM Users 
) 
+0

先生、私はパスワードの変更を守っているだけでなく、私も名前とコンテキストにつけておく必要があります。どうすればいいですか? –

+1

あなたは本当にあなただけを書くことができますか? 'u.Pass = tu.Pass'ではなく' Pass = tu.Pass'ですか?それは私には奇妙に思える。そして、 'Users'が更新されているテーブルの1つであるとき、あなたはトップレベルで' NOT IN(SELECT Pass FROM Users) 'を持つことができますか?ドキュメントには、「現在、テーブルを更新してサブクエリ内の同じテーブルから選択することはできません」と記載されています。 – ruakh

+0

@ruakh良い質問、私は再度チェックします。 SQL Serverでは、更新の割り当ての左側にプレフィックスを付けるとエラーになりますが、MySqlについてはわかりません。また、 'IN'の妥当性を再確認します。 –

関連する問題