回答編集履歴

3

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

2017/02/07 16:38

投稿

7tsuno
7tsuno

スコア310

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

2

10001になる理由を追記

2017/02/07 16:38

投稿

7tsuno
7tsuno

スコア310

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- 3. ソートテーブルは番号順に並んでいるのでここで分析関数は必要ありません。
33
+ 3. ソートテーブルは番号順に並んでいるのでここで分析関数は必要ありません。(ここがポイント!全て10001になってしまうのは結果が一件だとROWNUMは常に1を返すからです。)
34
34
 
35
35
 
36
36
 

1

FROM句が抜けてました

2017/02/07 16:17

投稿

7tsuno
7tsuno

スコア310

test CHANGED
@@ -13,6 +13,8 @@
13
13
  FROM no_table,sort_table WHERE data_table.cd = sort_table.cd
14
14
 
15
15
  )
16
+
17
+ FROM data_table
16
18
 
17
19
  WHERE data_table.no IS NULL;
18
20