SQL文の質問です

このQ&Aのポイント
  • 運用上の問題でキー項目が設定されていないDBがあり、その中の「locate」フィールドの値を更新する必要があります。
  • データの件数が多く、UPDATE3回実行は処理時間がかかりすぎたため、できれば、SQL1文で処理させたいです。
  • 旧の値を一旦別の値にUPDATEし、残り2つをUPDATEし、最初の1つを再度UPDATEする方法をお探しです。
回答を見る
  • ベストアンサー

SQL文の質問です

------------------- |No|・・・|locate| ------------------- | 1|・・・| LA-01| ------------------- | 1|・・・| LA-02| ------------------- | 2|・・・| LA-01| ------------------- | 2|・・・| LA-01| ------------------- | 2|・・・| LA-02| ------------------- | 2|・・・| LA-03| ------------------- | 3|・・・| LA-03| ------------------- | 3|・・・| LA-03| ------------------- 上のように、運用上の問題で、キー項目が設定されていないDBが あり、その中の「locate」フィールドの値を更新しなくてはいけません。   旧 新 LA-01 → LA-02 LA-02 → LA-03 LA-03 → LA-01 「一旦、どれかをまったく別の値にUPDATEしたあと、  残り2つをUPDATEし、最初の1つを再度UPDATEする」 と考え実行してみたのですが、データの件数が多く、 UPDATE3回実行は処理時間がかかりすぎたため、 できれば、SQL1文で処理させたいのですが、 いい考えが浮かびません。 よい方法が無いか知恵をお貸しください。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

それほど考えすぎなくてもいいと思います。 UPDATE TBLA SET locate= CASE locate WHEN 'LA-01' THEN 'LA-02' WHEN 'LA-02' THEN 'LA-03' WHEN 'LA-03' THEN 'LA-01' END WHERE locate IN ('LA-01','LA-02','LA-03') テーブルスキャンで1レコードにつき1回ずつ置き換え処理が行われるだけです。 一気に実行すれば「LA-01がLA-02に更新されたあと、さらにLA-03に更新されたりしないか」と考える必要はありません。

bakuretsu
質問者

お礼

なるほど。 実行してみたら、できました。 ありがとうございました。

関連するQ&A

  • SQL UPDATE 文 GroupByの値を更新したい

    SQLの UPDATE文について質問させていただきます。 テーブル内のデータを日付と時間で GroupBy して カウント求めています。 求めた値(カウント)を、日付をキーにして同じテーブル内のフィールドに更新するSQLを作成したいと考えています。 GroupByして、カウントを求めることはできるのですが、 どうしても、UPDATE文を実行させることができません。 この処理は、SQLで行うことはできるのでしょうか? 下記に、UPDATE前と後のテーブルデータを記載しています。 日付   時刻 20090101 0:00  20090101 0:00 20090102 0:00 20090102 0:00 20090102 1:00 20090103 2:00 ↓ 日付   時刻 カウント 20090101 0:00 2 20090101 0:00 2 20090102 0:00 2 20090102 0:00 2 20090102 1:00 1 20090103 2:00 1 よろしくお願いいたします。

  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。

  • SQL文で

    SQL2000serverで 異なる2つのデーターベースの中にある 別のテーブルの情報を SQL文を使って、抽出する事は出来るのでしょうか? たとえば下記のように「DB-A」「DB-B」と言った 二つのDBの中のそれぞれのテーブルのIDフィールドで リレーションを取ってDB-AのTablA1のFldAの 値(AA)からDB-BのTablB1のFldBの値(あ)を 抽出することはSQL文で可能なのでしょうか? DB-A DB-B TablA1 TableB1 ID FldA ID FldB 1 AA 1 あ 2 BB       2 い 3 CC 3 う 4 DD 4 え

  • SQL文で変数の使用

    VB6.0でオラクルDBにSQL文を発行したいのですが、 変数の値を使用して更新(update)や追加(insert) 処理を行うときの構文がわかりません。 どなたか教えてください。

  • SQLが通りません

    $sql2 = "UPDATE num SET ; $sql2 = "no= ".trim(db_encode($no_u))." "; $sql2.= "where no=".trim(db_encode($no)); $result = mysql_query($sql2,$db) or die("失敗しました3".mysql_error ()); と記述しましたが通りません。 どこがおかしいのかわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • アクセス2000のSQL文

    お世話になります。 アクセス2000のSQL文で以下のことが可能か教えてください。 新金額と旧金額の二つのフィールドがあります。 旧金額のフィールドの値が0の時は新金額、そうでないときは旧金額の値を引きたいのです。 select 商品名, case 旧金額 = 0 when 新金額 else 旧金額 end from テーブル といった感じです。 アクセスではこういったのは、できないのでしょうか? ご教授お願いします。

  • 動的SQLのCOUNTのとり方

    動的SQLで、DBの件数を取得したいのですが、 うまく取得できず困っています。 教えてください! 以下の様に、記述しているのですが取り方間違っていますか? EXEC SQL EXECUTE statment INTO :CNTNUM; PREPEAした、statmentには SELECT COUNT(*) FROM テーブル名 where kbn = 3; と、ごくごく普通のSELECT COUNT文です。 cnt_numは、int型のホスト変数で宣言しています。 デバックしながら実行すると、cnt_numの値は初期化した時の 0のままです。実際取得した件数が0件なのかもと思い 初期化時に3を代入して実行したら、やはり値は3でした。 なので、件数が取得出来ていないようです。 オラクルエラーにもならず、次の処理へ流れていってしまいます。 知っている方、教えてください。

  • リレーションをSQL文で作る方法は?

    urizakaです 今まではSQL-Serverを使っていたのですが、今度からPostgresSQLを使うこと になりました。 さて、そこで質問なのですが、SQL文でテーブルを作るとき、他のテーブルの カラム(フィールド)と作ったテーブルのカラム(フィールド)のリレーションを 作るにはどうすれば良いのでしょうか? 特に、シリアル型で作ったフィールドの値を外部参照キーとして持ってきたい 場合はどのようにSQL文を書けばよいのでしょうか? すみませんが、よろしくお願いします。

  • [ACCESS/VBA]動的にSQL文をテーブルから抽出する方法?

    ボロボロです。知恵が足りずとても困っています。どなたか教えてください。 テーブル「T_SQL」の各レコードに、 クエリのSQL文(フィールド名=「strSQL」)と クエリ名(フィールド名=「QName」)と 通しNo.(フィールド名=「No」) をデータとして入力し、アクション等に応じて、「T_SQL」から 抽出したSQL文を、 マクロの「プロシージャの実行」の プロシージャ名 SetSQL("クエリー1",FindSQL(No)) により クエリ「クエリー1」に代入したいのです。 現在以下の通りに作りました。 'データベース定義 Public db As Database 'レコードセット定義 Public rs As Recordset Public Function SetSQL(QName As String, strSQL As String) CurrentDb.QueryDefs("QName").SQL = strSQL End Function Public Function FindSQL(No As String) Set db = CurrentDb() Set rs = db.OpenRecordset("T_SQL", dbopendynaset) strcriteria = "[No]='" & No & "'" rs.FindFirst strcriteria FindSQL = rs!strSQL rs.Close db.Close End Function これで実行すると、 「コンパイルエラー メソッドまたはデータメンバが 見つかりません」 というエラーメッセージが出ます。 ちょこちょこいろんなところを修正してみても、 このメッセージだけでなく他にもいろんな エラーメッセージが出ます。 冒頭に書いたような機能を可能にするには、 どのように記述すればよいのでしょうか?? ほんとにほんとに困っています。どなたか助けてください。

  • sql文のヵウント関数について

    sql文のcountを使い、humanテーブルのレコード件数を取得し出力したいのですが、 Object of class SQLite3Result could not be converted to string in のエラーが出て困っています。 (1)humanテーブルのレコード件数を表示する方法を教えてください。(sql文はうまく動いているのが確認できているので、表示する方法を教えていただきたいです。データベースの接続も正常です。) (2)sqlの出力って配列のみなのでしょうか? <?php // 変数の初期化 $db = null; $query=null; $con =null; $db = new SQLite3("test.db"); $res = $db->query ($sql); // データの取得 $query = "SELECT count (id) from human"; //クエリを実行 $con = $db->query($query); //データの件数を表示する print $con; ?>

    • ベストアンサー
    • PHP