- ベストアンサー
SQLで一行更新する方法
- 初心者の方がSQLでデータの一行を更新する方法について教えてください。
- データの特定の列を更新するためには、UPDATE文を使用します。
- 一部の列のみを更新する場合は、WHERE句を使用して条件を指定することができます。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>クエリをそのまま実行しました。 とありますが、その後ろには >この'dbo'というのはWITH句の前にある文に含まれているのですが、 と書いてありますよね。 これはそのまま実行したとはいえません。 どうしてその前のステートメントは開示していただけないのですか?(dboのキーワードがそのステートメント内にあるのですよね) ちなみにWITHステートメントは調べていただけましたか。 私はクエリも書きましたが検索していただくことを推奨してますが・・・ WITHステートメントを調べれば、このステートメントのスコープについてかかれており、直前・直後のステートメントでは セミコロンが必要なことも明記されています。 >入れてみましたがダメでした。 前回と同じなのか、別のエラーなのか、やはりこれではフォローできません。 ちなみに今回の事例のような場合、普通はNo.3のnharasawaさんのおっしゃるとおりfetchで処理していくのが一般的です。 update一文で処理をすれば、その意図がみえづらくなり後々困ることになるからです。
その他の回答 (6)
- Senna_FF
- ベストアンサー率45% (153/334)
エラー内容のとおりwith句の前の文末にセミコロンをいれたら駄目なのでしょうか?
お礼
入れてみましたがダメでした。
- nora1962
- ベストアンサー率60% (431/717)
仮にテーブル名を「T」として、 ・X,Yで一意になる。 ・順番はX,Yの昇順につける。 を前提にすれば create table T ( X varchar(3), Y varchar(3), [number] int ) insert into T values ( 'GHU', 'KJI', 0 ); insert into T values ( 'HUG', 'EER', 0 ); insert into T values ( 'HUU', 'CPI', 0 ); update T set T.[number] = Q.rn from T inner join ( select X,Y, row_number() over( order by X, Y ) as rn from T ) as Q on T.X=Q.X and T.Y=T.Y で対応できるはずです。 前提が違う場合は(X,Yで一意にならないなど)、別のやり方が必要でしょう。
- root139
- ベストアンサー率60% (488/809)
まず、前提として、XとYの文字列昇順(ABC順)の番号を NUMBER カラムに格納したいという事でよろしいでしょうか? また、1~30までは変更して31番目以降は元のままということで良いでしょうか? もし、そうだとすると下記の様なUPDATE文を書けば良いかと。 1. サブクエリで対象の行以前の行の数を取り出し NUMBER カラムに設定する 2. ただし、31以上の場合は元の値を設定する 例) ------------------------------------ UPDATE target_table SET NUMBER = ( SELECT CASE WHEN COUNT(*) <= 30 THEN COUNT(*) ELSE a.NUMBER END FROM target_table b WHERE b.x < a.x OR b.x = a.x AND b.y <= a.y ) FROM target_table a; ---------------------------------------- もし、この前提が間違っていましたら、割振る番号についてのルールなどを提示して下さい。
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
1個のUPDATEでは出来ないので、CURSORと番号の変数をDECLAREで宣言し、FETCHで1件づつ読み出し、番号をカウントアップしながら、UPDATEで1件づつの処理をレコードの終わるまで繰り返します。
お礼
カーソルを作成し、FETCH処理を行うやりかたでもいいんですね。 カーソルとFETCHはまだ勉強途中なので今度試してみようと思います。
- Senna_FF
- ベストアンサー率45% (153/334)
発行した更新クエリと、エラー内容を書いていただけないと、フォローのしようがないです。
お礼
Senna_FFさんの書いたクエリをそのまま実行しました。 テーブル名は変更してあります。 しかし、エラーで メッセージ 336、レベル 15、状態 1、行 7 'dbo' 付近に不適切な構文があります。これが共通テーブル式の場合は、前のステートメントをセミコロンで明示的に終了してください。 とエラーがでます。 この'dbo'というのはWITH句の前にある文に含まれているのですが、どうやらWITH文からしておかしいと判断しているように思えるのですが、どうでしょうか?
- Senna_FF
- ベストアンサー率45% (153/334)
「SQL Server UPDATE CTE」「SQL Server ROW_NUMBER()」 でそれぞれWeb検索してみてください。 これら機能の組み合わせ(CTEとROW_NUMBER())で実現可能かと思われます。 仮にテーブル名を<TestTable>とすれば、下記のように・・ WITH cte_TestTable AS ( SELECT *, ROW_NUMBER() OVER(ORDER BY X ASC) AS ROW_NUM FROM TestTable ) UPDATE cte_TestTable SET NUMBER = ROW_NUM
お礼
失礼しました。 当方では、SQL Server2005を使用しております。 上記の文法ではエラーがでるのですが、何故でしょうか?
補足
了解しました。 早速、試してみます。
お礼
ありがとうございます。 返答がだいぶ遅れました。 いったん出直してこようかと思います。