• ベストアンサー

updateのWHERE句にサブクエリーを書く事は不可?

同じテーブルに対し、サブクエリーを使用して 更新することは可能でしょうか? test 1 である条件にマッチしたIDに対し、 フラグを書き換えたいのですが・・動作しませんでした。 update test1 set flg = 0 WHERE test_id = ALL (SELECT test_id FROM test1 WHERE flg = 1 AND a = 0) #1093 - You can't specify target table 'test1' for update in FROM clause

  • php4
  • お礼率42% (373/888)
  • MySQL
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

エラーメッセージを訳すと、「あなたはUPDATEのFROM句で対象テーブルの'test1'を指定することはできません」となっています。 だいたい、サブクエリの中の条件式を見ましたけど、サブクエリにする必要性が感じられません。 サブクエリのWHERE句をそのまま使えば良いのでは?

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

この条件だと「flg=1 and a=0」を満たす「test_id」が複数あると「flg」を 更新しませんが、そういった仕様でいいのですか?

関連するQ&A

  • MySQLのUPDATE文でサブクエリ

    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' これでもエラーになってしまい、うまくいきません。

    • ベストアンサー
    • PHP
  • 同じテーブル内同士で更新したい

    MySQLバージョン4.1.16を使用しています。 同じテーブル内で、user_idが「aaaa」のnumカラム値を 「bbbb」のnumカラム値でupdateしたいのですが、 次のようなsqlだとエラーが出てしまいます・・・ なんとかしてできる方法はないでしょうか? $sql = "UPDATE users SET num = (SELECT num FROM users WHERE user_id = 'bbbb') WHERE user_id = 'aaaa'"; Error Number: 1093 You can't specify target table 'users' for update in FROM clause テーブル「users」 +----------+---------+ |  user_id  |  num  | +----------+---------+ |  aaaa   |   1   |←成功すれば2になる +----------+---------+ |  bbbb   |   2   | +----------+---------+

  • 最大値を持つレコードを削除したい

    customerテーブル内のprice列の最大値を持つレコードを削除したいのですが、上手くいきません。よろしくお願いします。 DELETE FROM customer WHERE `price` = ( SELECT max( `price` ) FROM customer ) ; エラーメッセージは #1093 - You can't specify target table 'customer' for update in FROM clause と出ます。これは、同じテーブルを参照しているためのエラーのようです。 MySQLのバージョンは、5.0.48です。

    • ベストアンサー
    • MySQL
  • サブクエリーについて教えてください。

    こんにちは!以下のようなことがサブクエリーを使用してできるか?他にどんな方法があるか、アドバイスをお願いします。 あるテーブル(TABLE)から2段階でデータをselectし、計算させたいのですが分かりません。 一段階目 select a,b,c,d,e,f from TABLE where a='A' and b='B' 二段階目(上記の結果を使って、ここからが分かりません) select c,d,e,sum(f) as 結果 from TABLE(?) group by c,d,e having e='E' やりたいことの概要: 1. a='A' and b='B'でデータを抽出 2. 1.で抽出したデータに対してグループ化して集計する これを一回で実行するにはどのようにしたら良いでしょうか?サブクエリーでできそうだと思い、いろいろ調べましたが、よく分かりませんでした。 よろしくお願いします。

  • サブクエリーのパフォーマンスについて

    こんばんわ。 ある書籍にサブクエリーを【1】より【2】にした方がパフォーマンスがいいと書いてありました。 パフォーマンスがいい理由を教えて頂けないでしょうか?? 【1】 UPDATE Absenteeism SET severity_points= 0, reason_code = 'long term illness' WHERE EXISTS (SELECT * FROM Absenteeism AS A2 WHERE Absenteeism.emp_id = A2.emp_id AND Absenteeism.absent_date = (A2.absent_date + INTERVAL '1' DAY)); 【2】 UPDATE Absenteeism AS A1 SET severity_points = 0, reason_code = 'long term illness' WHERE EXISTS (SELECT * FROM Absenteeism AS A2 WHERE A1.emp_id = A2.emp_id AND (A2.absent_date + INTERVAL '1' DAY) = A1.absent_date); よろしくお願いします。 以上

  • WHERE句の?

    お世話になります よろしくお願いします。 さっそくで申し訳ないのですが SQL分で SELECT test01 FROM test WHERE test01 = ? の「?」というのはどういう意味があるのでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • MySQL
  • select されたレコードの操作

    以下のようなuser_idとuser_pwのtableがあります。 |id(ai)|user_id|user_pw|flg| |1|AAA|111|0| |2|BBB|222|0| select id from table where user_id = AAA をされると 1 を返し、 update table set flg = 1 where id = 1 かまたは update table set flg = 1 where user_id = AAA を発行したいと思っています。 ただ、sql 発行元から2個のsqlを出せない事情があり、DB側で対応しなければなりません。 トリガはselectでは使えませんよね?  最悪、query_logを監視しながらselectが来たら自分でupdateを発行するスクリプト しかないのかと考えています。 アドバイスお願いします。

  • 通し番号が一番若いレコードの削除

    お世話になります。 Linuxを使ってMySQLのレコードが追加された時に自動で処理をする スクリプトを作っています。 データベースはtestで、 データベースのフィールドは、name=varchar(16), password=varchar(16),date=TIMESTAMP, number=int AUTO_INCREMENT となっています。 データを一個ずつ処理したいので、 select Name from test WHERE number=(select MIN(number) from test) としてみた所、上手く希望のデータが取り出せたので、 今度は用がなくなったデータを削除する為に、 delete from test WHERE number=(select MIN(number) from test) としてみたところ、 You can't specify target table 'test' for update in FROM clause と出て、エラーになりました。 エラー内容はサブクエリの結果が変わるようなクエリは発行できないと 言う感じでした。 上手く処理をする方法を思いついたと思ったのですが、このようになって、 どうしたものかと途方に暮れています。 上手く処理をする方法をご存知の方が居られましたら是非御教授いただきたくお願いします。

    • ベストアンサー
    • MySQL
  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • MySQLのサブクエリーでエラーがでます

    現在MySQLを使って開発をしています。 SQLもMySQLもまだあまり使ったことがないのでなにか大きな勘違いをしている かもしれませんが、自分で作ったデータベースにMysqlコマンドでアクセスし、 以下のようにselectを行うとsyntaxエラーが発生します。 mysql> select CREATE_DATE from user where cust_id = (select cust_id from customer where memo = 'memo'); ERROR 1064: You have an error in your SQL syntax near 'select cust_id from customer where memo = 'memo')' at line 1 しかしサブクエリーの内容も、その前のselectもそれぞれ下記のように単体で実行すると正常に動作するので、文法的には間違っていないと思います。 ERROR 1064のsyntaxエラーは何を指しているのでしょうか? ぜひご教示ください。 mysql> select cust_id from customer where memo = 'memo'; +---------+ | cust_id | +---------+ | 1 | +---------+ 1 row in set (0.00 sec) mysql> select CREATE_DATE from user where cust_id = '1'; +-------------+ | CREATE_DATE | +-------------+ | 2001-07-23 | +-------------+ 1 row in set (0.00 sec)