1. ホーム
  2. sql

[解決済み】FROM句で更新対象のテーブルを指定できない

2022-03-24 16:28:59

質問

簡単な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クエリを修正するにはどうすればよいですか?

どのように解決するのですか?

問題は、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 節で結果を制限することもできます。