teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

質問を勘違いしていました。

2017/02/07 16:38

投稿

7tsuno
7tsuno

スコア310

answer CHANGED
@@ -1,19 +1,25 @@
1
1
  手元に実行環境がないので不確実ですが、
2
2
 
3
3
  ```sql
4
+ UPDATE
5
+ data_table
6
+ SET
4
- UPDATE data_table SET data_table.no =
7
+ data_table.no = T.no
8
+ FROM
9
+ data_table
10
+ INNER JOIN
5
- (SELECT
11
+ (SELECT
12
+ sort_table.cd cd,
13
+ no_table.no + ROW_NUMBER() OVER(ORDER BY sort_table.sort) no
14
+ FROM
6
- no_table.no + sort_table.sort
15
+ sort_table,no_table
7
- FROM no_table,sort_table WHERE data_table.cd = sort_table.cd
8
- )
16
+ ) T
17
+ ON
9
- FROM data_table
18
+ data_table.cd = T.cd
19
+ WHERE
10
- WHERE data_table.no IS NULL;
20
+ data_table.no IS Null
11
21
  ```
12
22
 
23
+ という感じでしょうか?
13
- 1. まず全体WHERE区Null以外を更新するのソートテーブルのJOINは必要ありせん
24
+ SETでサブクエリ結果が一件ないエラーになってしいます
14
-
15
- 2. サブクエリで別のデータテーブルをJOINしてしまうとサブクエリでの取得結果が複数になってしまうため、メインクエリのデータテーブルとJOINさせます。
16
-
17
- 3. ソートテーブルは番号順に並んでいるのでここで分析関数は必要ありせん。(ここがポイント!全て10001になってしまうのは結果が一件だとROWNUM常に1を返すからです。)
25
+ た、一件だと10001になってしまうのは結果が一件だとROW_NUMBER必ず1を返すからです。
18
-
19
- 理屈的にはいけるはずですがだめでしたらごめんなさい

2

10001になる理由を追記

2017/02/07 16:38

投稿

7tsuno
7tsuno

スコア310

answer CHANGED
@@ -14,6 +14,6 @@
14
14
 
15
15
  2. サブクエリで別のデータテーブルをJOINしてしまうとサブクエリでの取得結果が複数になってしまうため、メインクエリのデータテーブルとJOINさせます。
16
16
 
17
- 3. ソートテーブルは番号順に並んでいるのでここで分析関数は必要ありません。
17
+ 3. ソートテーブルは番号順に並んでいるのでここで分析関数は必要ありません。(ここがポイント!全て10001になってしまうのは結果が一件だとROWNUMは常に1を返すからです。)
18
18
 
19
19
  理屈的にはいけるはずですがだめでしたらごめんなさい

1

FROM句が抜けてました

2017/02/07 16:17

投稿

7tsuno
7tsuno

スコア310

answer CHANGED
@@ -6,6 +6,7 @@
6
6
  no_table.no + sort_table.sort
7
7
  FROM no_table,sort_table WHERE data_table.cd = sort_table.cd
8
8
  )
9
+ FROM data_table
9
10
  WHERE data_table.no IS NULL;
10
11
  ```
11
12