MySQLのUPDATE文でサブクエリの使い方について教えて下さい。
MySQLのUPDATE文でサブクエリを使うと「#1093 - You can't specify target table 'exam' for update in FROM clause 」というエラーになってしまいます。
「あるテーブルに対してデータを追加・更新する場合、同じテーブルをサブクエリーに使えない」
「サブクエリー内のFrom句はテンポラリテーブルとして扱うことが可能」
ということはわかりましたが、これに従いSQL文を変更してもうまくいきません。
どのようにSQL文を作ったら良いか教えていただければと思います。
環境
PHP:5.1.6
MySQL:5.0.77
------具体的なSQL文---------------------------------------
テーブル名:sample
カラム名:date(DATETIME型),name,flag
上記テーブルに対して、
1.社員(列名:nameのsuzuki)の最新出勤日(列名:date)のflagを1にする
2.社員(列名:nameのsuzuki)の最新出勤日以外(列名:date)のflagを2にする
という処理をしたいと思います。
まず、SELECT文を作ってみました。
1.最新出勤日データを抽出
SELECT * FROM sample WHERE (date= (select max(date) from sample)) and name='sizili'
2.最新出勤日以外のデータを抽出
SELECT * FROM sample WHERE not (date= (SELECT max(date) FROM sample)) and name='suzuki'
これをUPDATE文に変更すると、
#1093 - You can't specify target table 'exam' for update in FROM clause
というエラーになります。
上記をUPDATE文に変更
1.最新出勤日データを抽出
UPDATE sample SET flag=1 WHERE (date= (select max(date) from sample)) and name='sizili'
2.最新出勤日以外のデータを抽出
UPDATE sample SET flag=2 WHERE not (date= (SELECT max(date) FROM sample)) and name='suzuki'
エラー文を検索したところ下記のような情報を見つけることができました。
「仕事SPOT」
MySQLでサブクエリ(エラー#1093を回避する方法)
http://wsjp.blogspot.com/2009/12/mysql1093.html
「あるテーブルに対してデータを追加・更新する場合、同じテーブルをサブクエリーに使えない」
「サブクエリー内のFrom句はテンポラリテーブルとして扱うことが可能」
と記載されています。
このページに掲載してあるように変更を加えてみました。
1.最新出勤日データを抽出
UPDATE sample SET flag=1 WHERE (date= (select max(date) as test_max from sample)) as text_tb and name='sizili'
2.最新出勤日以外のデータを抽出
UPDATE sample SET flag=2 WHERE not (date= (SELECT max(date) as test_max FROM sample)) as test_tb and name='suzuki'
これでもエラーになってしまい、うまくいきません。
No.2ベストアンサー
- 回答日時:
掲載されてるサイトの解説をちゃんと読めば、できると思いますけど…
UPDATE sample SET flag=2 where date = (
SELECT max_date
FROM ( SELECT MAX( date ) AS max_date FROM sample WHERE name='suzuki' ) AS temp1
);
ご回答ありがとうございます。
うまく動きました。
例示したサイトを参考に自分でも作ってみましたが、うまくSQL文を作れていませんでした。
うまく動かず先に進めなかったので、とても助かりました。
No.1
- 回答日時:
>1.社員(列名:nameのsuzuki)の最新出勤日(列名:date)のflagを1にする
>2.社員(列名:nameのsuzuki)の最新出勤日以外(列名:date)のflagを2にする
updateの中に同じテーブルを含んじゃいけないんだから分けるしかないでしょう
SELECT @max:=max(date) FROM sample;
UPDATE sample SET flag=(date=@max,1,2);
ご回答ありがとうございます。
UPDATEの中に同じテーブルを含むとダメだと私も思っていましたが、ネットで調べて例示したサイトに辿り着きました。
「23468」さんが回答して下さいましたが、
UPDATE sample SET flag=2 where date = (
SELECT max_date
FROM ( SELECT MAX( date ) AS max_date FROM sample WHERE name='suzuki' ) AS temp1
);
というSQL文でうまく動きました。
SQL文は奥が深いですね。
今後とも、ご回答宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPとMysqlを使用した集計表の...
-
PHP+MySQLで月ごとの数量を表...
-
SQLローダーCSV取込で、囲み文...
-
【PL/SQL】FROM区に変数を使う方法
-
テーブルの最後(最新)のレコー...
-
1の行を固定した上でVBAを用い...
-
select文の実行結果に空白行を...
-
単一グループのグループ関数で...
-
エクセルのソートについて
-
SQLで条件にヒットしたレコード...
-
<SQL>重複しているデータの場合...
-
トランザクションログを出力せ...
-
コンボボックスのソートについて
-
【SQLサーバ】float型における...
-
テーブルのフィールドの一番長...
-
SQL文 複数実行
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
大量レコードをTRUNCATEせずに...
-
VC++ (ADO) で Access の Yes/N...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP+MySQLで月ごとの数量を表...
-
掲載日と更新日の管理の仕方
-
【PL/SQL】DATE型の時刻の表示...
-
SQLでMAXを使った
-
PHPでMySQL内のデータの合計値...
-
php mysql データ登録
-
PHP+MYSQLで画像のようなイベン...
-
MySQLのUPDATE文でサブクエリ
-
日替わりメッセージを表示させ...
-
データ更新用のphpの記述でデー...
-
JOINを使った文で、date > now();
-
postgresのカレンダーについて
-
空文字のエラーチェック(問い...
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
select文の実行結果に空白行を...
-
単一グループのグループ関数で...
-
count関数の値をwhere句で使用...
-
2つの列が同じ値の行を取得するSQL
-
【PL/SQL】FROM区に変数を使う方法
おすすめ情報