- - PR -
sql-serverで連番に一括更新するsqlについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-15 16:21
まだSQL初心者ですが、宜しくお願いします。
テーブル:m_table No SubNo Area Name ---- ---- ------ ------ 1001 14 北海道 山田 2001 22 東北 田中 2002 58 東北 長田 8003 39 関西 佐藤 9001 16 九州 鈴木 このテーブル例で登録済みの SubNo を一括で連番に更新することは出来ますか。 一通り調べてみて、Oracleでは以下のような記述で一括処理できるようですが SQL-Server ではそのまま使えないようです。。。 update m_table a set SubNo = (select count(b.No)+1 from m_table b where b.No < a.No); また、実際には Areaが北海道の場合は SunNO=1001〜 Areaが東北の場合は SunNO=2001〜 のように連番処理の対象を指定するのが目的です。 どなたか良い方法をご存じでしたら、 よろしくお願いします! | ||||||||||||
|
投稿日時: 2006-05-15 18:29
SQLServerのバージョンは何でしょうか?
#2000? 2005? 2005から増えたROW_NUMBER関数を使うと 以下のようなSQLで対応できたりするんですが・・・。
#実行前
#実行後
| ||||||||||||
|
投稿日時: 2006-05-15 19:19
回答ありがとうございます。
残念ながらSQL-Server2000です。 現バージョンだと簡単な記述は難しいのですかね。。 LOOP処理を行えば出来なくはないのですが、 せっかくなので他に良い手が無いか検討しているところです。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-05-15 20:22
これは「自己結合」というやりかたですが、SQL Server でもこれと同じようなやりかたでできませんか? あいにく手近に試す環境がないのですが、できてもよさそうな気がするのですが。 #フィールド名が No なのは、なんとなく予約語とぶつかりそうな気もしますが。 ちなみに、自己結合は対象となるレコード数の2乗に比例した処理が必要なので遅いですが、それさえ我慢すれば確実な方法です。もっとも、自己結合が必要な処理と言うのは RDB の使い方から逸れることが多いので、データー構造を再検討したほうが良いこともあります。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||
|
投稿日時: 2006-05-16 10:03
クエリアナライザーで動作確認していますが
update m_table a set SubNo = (select count(b.No)+1 from m_table b where b.No < a.No); サーバー : メッセージ 170、レベル 15、状態 1、行 1 行 1: 'a' の近くに無効な構文があります。 サーバー : メッセージ 156、レベル 15、状態 1、行 2 キーワード 'where' 付近に正しくない構文があります。 とエラーになります。。。 まだSQLでもサブクエリや複雑な結合処理を完全に理解していないので いろいろと試しながら確認しているところです。 確かに自己結合だと記述上は一括でも内部的には時間がかかりそうなので 今回は複数行に記述して処理してみようと思います。 | ||||||||||||
|
投稿日時: 2006-05-16 14:50
構文エラーと出てますので・・・
|
1