質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

15064閲覧

sqlserver 特定テーブルから値を取り連番で更新する方法

toarun

総合スコア12

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2017/02/07 12:38

編集2017/02/07 13:27

SQLServer2008です。

<<実現したいこと>>
・data_table.noがnullの場合、no_table.noの数値を取得し、
data_table.noに連番で振っていく。
番号を振る順はdata_table.cdの昇順とする。
・no_tableにはdata_table.noの最大値を更新する。

<<現在>>
テーブルdata_table
cd(主) no
ーーーーーーーー
A1 null
A3 null
A2 null
A4 9999

ソートテーブルsort_table
cd(主) sort
ーーーーーーーー
A1 1
A3 2
A2 3
A4 4

テーブルno_table
no
ーーー
10000

<<実現したいデータ>>
テーブルdata_table
cd(主) no
ーーーーーーーー
A1 10001
A3 10002
A2 10003
A4 9999

ソートテーブルsort_table
変更なし

テーブルno_table
no
ーーー
10003


自分なりに作ってみたのですが、「サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。」
のエラーが出て上手く行きません。
かといってサブクエリで使っている data_tableを外すと全て10001で更新されて上手く行きません。
初歩的な質問ですが宜しくお願いします。
UPDATE data_table SET data_table.no =
(SELECT
no_table.no + ROW_NUMBER() OVER(ORDER BY sort_table.sort)
FROM data_table,no_table,sort_table WHERE data_table.cd = sort_table.cd AND data_table.no IS NULL
)
FROM
data_table,no_table,sort_table
WHERE data_table.cd = sort_table.cd AND data_table.no IS NULL;
UPDATE no_table SET no = (SELECT MAX(no) FROM data_table);

AketiJyuuzou👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

SQLServerの分析関数の使用例
https://oraclesqlpuzzle.ninja-web.net/sqlserver2008-sql1-olap.html
の「11. update文で分析関数の値に更新」を見ながら、
SQLFiddleのSQLServer2014環境で作ってみました :-)

sql

1create table data_table( 2cd char(2) primary key, 3Val int); 4 5create table sort_table( 6cd char(2)primary key, 7sort int); 8 9create table no_table(no int); 10 11insert into data_table 12values('A1',null), 13 ('A3',null), 14 ('A2',null), 15 ('A4',9999); 16commit; 17 18insert into sort_table 19values('A1',1), 20 ('A3',2), 21 ('A2',3), 22 ('A4',4); 23commit; 24 25insert into no_table values(10000); 26commit; 27 28with UpdView as( 29select a.Val as OldVal, 30(select c.no from no_table c) + 31Row_Number() over(order by b.sort) as NewVal 32 from data_table a Join sort_table b 33 on a.cd = b.cd 34 where a.Val is null) 35update UpdView set OldVal = NewVal; 36 37select * from data_table; 38 39| cd | Val | 40|----|-------| 41| A1 | 10001 | 42| A2 | 10003 | 43| A3 | 10002 | 44| A4 | 9999 |

投稿2017/02/10 21:18

編集2019/03/12 06:32
AketiJyuuzou

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

手元に実行環境がないので不確実ですが、

sql

1UPDATE 2 data_table 3SET 4 data_table.no = T.no 5FROM 6 data_table 7INNER JOIN 8 (SELECT 9 sort_table.cd cd, 10 no_table.no + ROW_NUMBER() OVER(ORDER BY sort_table.sort) no 11 FROM 12 sort_table,no_table 13 ) T 14ON 15 data_table.cd = T.cd 16WHERE 17 data_table.no IS Null

という感じでしょうか?
SETでのサブクエリは結果が一件でないとエラーになってしまいます。
また、一件だと10001になってしまうのは、結果が一件だとROW_NUMBERは必ず1を返すからです。

投稿2017/02/07 16:06

編集2017/02/07 16:38
7tsuno

総合スコア310

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toarun

2017/02/08 11:13 編集

まだ見よう見まねでしか作れずJOIN句のUPDATEは思いつきませんでした。 お恥ずかしいです限りですがおかげで勉強になりました。有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問