2

次のクエリがあります。

UPDATE lessonstatus
INNER JOIN user ON lessonstatus.user_id = user.user_id
SET user_id = (SELECT user_id FROM user WHERE username = 'too_many_accounts')
WHERE last_name = 'stupid' 
AND first_name = 'user'
AND username != 'too_many_accounts'
AND lessonstatus.lesson_id NOT IN (SELECT lesson_id FROM lessonstatus WHERE user_id = 1);

ただし、実行しようとすると次のエラーが発生します。

Error Code : 1093
You can't specify target table 'lessonstatus_rtab' for update in FROM clause

このクエリが機能するように修正するにはどうすればよいですか?

4

2 に答える 2

3

SELECT同じクエリで更新しているテーブル (サブクエリであっても) からはできません。それが、「ターゲット テーブルを指定できません」というエラーの意味です。

ただし、ステートメント内でuserand をlessonstatus複数回結合UPDATEし、結合基準を創造的に使用して、必要な個々の行を選択することができます。

NOT IN結合でシミュレートする方法は、 LEFT OUTER JOIN. その結合の右側が一致しない場合、それNOT INが真になります。

UPDATE lessonstatus l1
  INNER JOIN user u1 ON (l1.user_id = u1.user_id)
  INNER JOIN user u2 ON (u2.username = 'too_many_accounts')
  LEFT OUTER JOIN lessonstatus l2 
    ON (l1.lesson_id = l2.lesson_id AND l2.user_id = 1)
SET l1.user_id = u2.user_id
WHERE u1.last_name = 'stupid' AND u1.first_name = 'user'
  AND u1.username != 'too_many_accounts'
  AND l2.lesson_id IS NULL; -- equivalent to "l NOT IN l2"

注意:このクエリの構文をテストしましたが、実際のデータではテストしていません。とにかく、それはあなたを始めるはずです。

于 2008-11-06T17:31:17.697 に答える
0

さらにエラーがあります(「user」テーブルと「user_rtab」エイリアスが一致しません。修飾されていないフィールド名の使用はお勧めしません)が、UPDATE構文自体は類似している必要があります。

UPDATE lessonstatus
SET user_id = (SELECT TOP 1 user_id FROM user WHERE username = 'too_many_accounts')
FROM lessonstatus
    INNER JOIN user ON lessonstatus.user_id = user_rtab.user_id
WHERE last_name = 'stupid' 
    AND first_name = 'user'
    AND username != 'too_many_accounts'
    AND lessonstatus.lesson_id NOT IN (
        SELECT lesson_id FROM lessonstatus WHERE user_id = 1
    );
于 2008-11-06T17:06:20.167 に答える