FROM句で更新のターゲットテーブルを指定することはできません。質問する

FROM句で更新のターゲットテーブルを指定することはできません。質問する

シンプルな MySQL テーブルがあります:

CREATE TABLE IF NOT EXISTS `pers` (
  `persID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(35) NOT NULL,
  `gehalt` int(11) NOT NULL,
  `chefID` int(11) DEFAULT NULL,
  PRIMARY KEY (`persID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES
(1, 'blb', 1000, 3),
(2, 'as', 1000, 3),
(3, 'chef', 1040, NULL);

次のアップデートを実行しようとしましたが、エラー 1093 のみが表示されます。

UPDATE pers P 
SET P.gehalt = P.gehalt * 1.05 
WHERE (P.chefID IS NOT NULL 
OR gehalt < 
(SELECT (
    SELECT MAX(gehalt * 1.05) 
    FROM pers MA 
    WHERE MA.chefID = MA.chefID) 
    AS _pers
))

エラーを検索したところ、mysqlの次のページが見つかりましたhttp://dev.mysql.com/doc/refman/5.1/en/subquery-restrictions.html、しかしそれは私にとっては役に立ちません。

SQL クエリを修正するにはどうすればいいでしょうか?

ベストアンサー1

問題は、MySQL では、何らかのばかげた理由で、次のようなクエリを記述できないことです。

UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM myTable
    INNER JOIN ...
)

つまり、テーブルに対してUPDATE/ INSERT/を実行している場合、内部クエリでそのテーブルを参照することはできません(ただし、外部テーブルのフィールドを参照することはできます...)DELETE


myTable解決策は、サブクエリ内ののインスタンスを に置き換えることです(SELECT * FROM myTable)

UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM (SELECT * FROM myTable) AS something
    INNER JOIN ...
)

これにより、必要なフィールドが暗黙的に一時テーブルにコピーされるようになるため、許可されます。

この解決策を見つけましたこここの記事からのメモ:

SELECT * FROM table実際には、サブクエリだけで済ませる必要はありません。単に例をシンプルにしておきたいだけです。実際には、最も内側のクエリで必要な列のみを選択し、WHERE結果を制限するための適切な句も追加する必要があります。

おすすめ記事