• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLで一行更新したい)

SQLで一行更新する方法

このQ&Aのポイント
  • 初心者の方がSQLでデータの一行を更新する方法について教えてください。
  • データの特定の列を更新するためには、UPDATE文を使用します。
  • 一部の列のみを更新する場合は、WHERE句を使用して条件を指定することができます。

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

  • ベストアンサー
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.7

>クエリをそのまま実行しました。 とありますが、その後ろには >この'dbo'というのはWITH句の前にある文に含まれているのですが、 と書いてありますよね。 これはそのまま実行したとはいえません。 どうしてその前のステートメントは開示していただけないのですか?(dboのキーワードがそのステートメント内にあるのですよね) ちなみにWITHステートメントは調べていただけましたか。 私はクエリも書きましたが検索していただくことを推奨してますが・・・ WITHステートメントを調べれば、このステートメントのスコープについてかかれており、直前・直後のステートメントでは セミコロンが必要なことも明記されています。 >入れてみましたがダメでした。 前回と同じなのか、別のエラーなのか、やはりこれではフォローできません。 ちなみに今回の事例のような場合、普通はNo.3のnharasawaさんのおっしゃるとおりfetchで処理していくのが一般的です。 update一文で処理をすれば、その意図がみえづらくなり後々困ることになるからです。

RAIKOUKUMA
質問者

お礼

ありがとうございます。 返答がだいぶ遅れました。 いったん出直してこようかと思います。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.6

エラー内容のとおりwith句の前の文末にセミコロンをいれたら駄目なのでしょうか?

RAIKOUKUMA
質問者

お礼

入れてみましたがダメでした。

すると、全ての回答が全文表示されます。
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.5

仮にテーブル名を「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)
回答No.4

まず、前提として、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; ---------------------------------------- もし、この前提が間違っていましたら、割振る番号についてのルールなどを提示して下さい。

すると、全ての回答が全文表示されます。
回答No.3

1個のUPDATEでは出来ないので、CURSORと番号の変数をDECLAREで宣言し、FETCHで1件づつ読み出し、番号をカウントアップしながら、UPDATEで1件づつの処理をレコードの終わるまで繰り返します。

RAIKOUKUMA
質問者

お礼

カーソルを作成し、FETCH処理を行うやりかたでもいいんですね。 カーソルとFETCHはまだ勉強途中なので今度試してみようと思います。

すると、全ての回答が全文表示されます。
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.2

発行した更新クエリと、エラー内容を書いていただけないと、フォローのしようがないです。

RAIKOUKUMA
質問者

お礼

Senna_FFさんの書いたクエリをそのまま実行しました。 テーブル名は変更してあります。 しかし、エラーで メッセージ 336、レベル 15、状態 1、行 7 'dbo' 付近に不適切な構文があります。これが共通テーブル式の場合は、前のステートメントをセミコロンで明示的に終了してください。 とエラーがでます。 この'dbo'というのはWITH句の前にある文に含まれているのですが、どうやらWITH文からしておかしいと判断しているように思えるのですが、どうでしょうか?

すると、全ての回答が全文表示されます。
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.1

「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

RAIKOUKUMA
質問者

お礼

失礼しました。 当方では、SQL Server2005を使用しております。 上記の文法ではエラーがでるのですが、何故でしょうか?

RAIKOUKUMA
質問者

補足

了解しました。 早速、試してみます。

すると、全ての回答が全文表示されます。

関連する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文でBがゼロのときエラーになります。 UPDATE TABLEa SET A = B / C 上記でエラーが出ないような(ゼロ除算エラー を回避できる)SQL文にする方法を知ってますか?

  • VBでSQL

    題の通りなのですが VBでSQLサーバ上のデータベースを操作したいのです 接続はできたのですが、 SQL文をVB上で実行するやり方がわかりません いろいろ試してみたのですが、 オブジェクトがないとか言われてしまいました。 初心者なので意味がよくわからず困っています。 アップデート、インサートなどをします。 本当に困っています。 よろしくお願いします。

  • SQLの性能に関して

    SQLの初心者です。 質問がわかりずらかったら申し訳ありません。Oracleを使用してます。 多くのSQL文(約1000個)と、そのSQLでアクセスしたテーブルが保持しているレコード件数、さらに処理時間がかかれた資料があります。 取得できたレコード件数の資料はありません。 これらの資料を元に、SQLの性能は何に相関があるか(例えばjoinの数など)回帰分析を用いて調べようとしてます。 join数以外に、処理時間と何を比較すれば、相関が出そうですかね? また、変数を増やして重回帰分析も考えてます。 比較対象のアドバイスをお願いします。

  • SQLで。

    webでphpを使ってpostgreSQLのデータを表示させています。 pgSQLのデータベース、「テーブルA」があります。 そこで「テーブルA」のデータを引っ張ってくるときに最後の50件だけを表示させたい場合は どういったSQL文だとそのデータを引っ張ってこれるのでしょうか? それともSQLでテーブルAのデータを全部引っ張ってきたあとphpで最後の50件だけ表示させないとだめなのでしょうか? ちなみに「テーブルA」にはフィールド名、「code」と言うフィールドにオートナンバー型のデータが 「1~n」あります。 初心者なのでうまく説明できなくて申し訳ありませんが 良いやり方がありましたら宜しくお願いしします。 PostgreSQL 7.0.2 PHP4

    • 締切済み
    • PHP
  • ACCESS2000のSQLについて

    ACCESS2000のSQL文について質問です。 K情報テーブル:(支店(テキスト型),所属(テキスト),氏名(テキスト),ログ(テキスト),抽出件数(数値),処理日(日付型)) 支店 所属 氏名 ログ 抽出件数 処理日 ----------------------------------------- 関東 埼玉 太郎 A   50    2009/02/25 関西 大阪 次郎 B   15    2009/04/01 関東 埼玉 太郎 A   10    2009/03/05 関西 大阪 次郎 B   5    2009/04/06 東北 青森 三郎 C   2    2000/01/02 東北 青森 三郎 A   2    2000/01/02 ・ ・ ・ ----------------------------------------- 以上のテーブル情報を、SQL文にて抽出したいのですが、抽出条件が私には難解で解決の見通しが立ちません。ご教授をお願いします。 ***条件*** [ログ] = "A" のみ抽出。 現在日から過去3ヶ月前までのデータのみ抽出。 [氏名]ごと[ログ]の総合計。 [氏名]ごとの[抽出件数]の総合計。 [ログ]の総合計の上位30件を降順で。 順位にNo.をふる。 上記の条件で抽出したデータをを下記の作業テーブルに出力したと思っております。 作業テーブル:順位,所属,氏名,ログ件数,抽出件数 宜しくお願いします。

  • SQL文で質問です

    SQL文で質問です。 テーブルA X NUMBER型 Y DATE型(年月日と時間) テーブルB Z NUMBER型 W DATE型(年月日) A,BをAを主テーブルとして外部結合し、同じ年月日でBには無いデータ を取得したいのですが、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND A.Y = B.W(+) AND B.Z IS NULL; というSQL文を実行すると、テーブルAには時間まで登録されているので 実際には取得したいデータが存在しても 「レコードが選択されませんでした」 になってしまいます。このため、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W,'YYYY/MM/DD')(+) AND B.Z IS NULL; としてみたところ、今度は3行目で 「ORA-00936: 式がありません」 というエラーになってしまいます。 外部結合にしたことがエラーの原因のようなのですが、DATE型の項目を キーにして外部結合にするにはどうすれば良いのでしょうか?

  • SQL_CALC_FOUND_ROWSのネスト

    こんにちは。 下記のようにSQL_CALC_FOUND_ROWSをネスト し、上位のSELECT文で、FOUND_ROWS() で 件数を取得しようとするとエラーになり、困ってお ります。 SELECT FOUND_ROWS() AS A FROM(SELECT SQL_CALC_FOUND_ROWS 1 FROM T_TABLE) AS A; どのようにネストしたSQL_CALC_FOUND_ROWS から件数を取得すればよいのでしょうか? ご教授お願い致します。

  • うまくPL/SQLが書けません。

    PL/SQLを作成しているのですが、うまくいかないので 質問させていただきました。SQL初心者ですがよろしければご教示ください。 テーブル名  カラム名 Bar       number numberには’AB734869 テスト’、‘AB364850 再テスト’ といった具合にまず8桁の番号が入り、その後データによってテキスト項目が続いています。 そしてnumberのデータへ、一律、頭から数えて5バイト目と6バイト目の間に’0000’という文字列を挿入したいと考えています。 例えば’AB734869 テスト’の場合は’AB7300004869 テスト’というようにしたいのですが、良い方法が思いつきません。 STUFF関数は使えませんし。。。UPDATEやINSERTを使ってやろうと思ったのですが、 どうしても出来ません。 皆様の知恵を拝借頂けたらと幸いです。 宜しくお願いいたします。 m(_ _)m

  • OracleとSQL ServerのSQL文上での差異について

    お世話になっております。 もしOracleやSQL Serverに関してご存知の方が いらっしゃいましたらご教授ください。 今、業務で 「Oracleに載せるシステムをSQL Serverで載せられないか?」 という話が出ており私が調査を行う事になりました。 しかし私のSQL Server経験が浅い為困っている点があります。 (以下の質問は当然ですがシステムで動く・動かない の話はヌキにしてのSQLレベルでの話です) ・Oracle特有のSQL構文をSQL Serverに見合った構文に 直すことによって(DATE→datetime/NUMBER→int等)一般的な SELECT文、INSERT、UPDATE、DELETE文はそのまま使う事が可能か? ・上の件に関する経験をお持ちの方・知識のある方にお聞きしますが 何かこの件に関する注意点などありますでしょうか? の2点になります。 どうかご存知の方がいらっしゃいましたらお願い致します。

このQ&Aのポイント
  • メール連絡帳を起動した際に突然「peapleへのアクセスを許可しますか」と表示され、「いいえ」をクリックしてしまったために再設定ができない問題が発生しています。
  • 現在、スタートボタンからpeapleアプリを検索しても見つからず、再設定ができない状況です。
  • 再設定方法について教えていただけないでしょうか?
回答を見る