回答編集履歴

1

見直し結果を追記

2023/05/23 11:05

投稿

neko_the_shadow
neko_the_shadow

スコア2230

test CHANGED
@@ -16,3 +16,37 @@
16
16
  ) AAA
17
17
  WHERE 順番 = 1
18
18
  ```
19
+
20
+ ---
21
+
22
+ **2023-05-23 20:00追記**
23
+
24
+ あらためて見直しました。「AND 実績.明細NO = REC.明細NO」は不要ですね。あとOVER句にPARTITION BYの追記も必要そうです。
25
+
26
+ ```SQL
27
+ SELECT AAA.*
28
+ FROM (
29
+ SELECT 実績.* ,ROW_NUMBER() OVER(PARTITION BY 実績.契約NO, 実績.契約年月日, 実績.金額
30
+ ORDER BY 実績.登録年月日 ASC, 実績.登録時間 ASC, 実績.明細NO ASC ) AS 順番
31
+ FROM 実績履歴 実績
32
+ WHERE 実績.契約NO = REC.契約NO
33
+ AND 実績.契約年月日 = REC.契約年月日
34
+ AND 実績.金額 = REC.金額
35
+ AND 実績.取消年月日 IS NULL
36
+ ) AAA
37
+ WHERE 順番 = 1
38
+ ```
39
+
40
+ また「取消情報抽出」の処理 (FOR RECの部分) はJOINではなくEXISTSで書いたほうがよさそうです。
41
+
42
+ ```SQL
43
+ SELECT *
44
+ FROM 取消履歴 取消
45
+ WHERE EXISTS (
46
+ SELECT *
47
+ FROM 実績履歴 実績
48
+ WHERE 取消.契約NO = 実績.契約NO
49
+ AND 取消.契約年月日 = 実績.契約年月日
50
+ AND 取消.金額 = 実績.金額
51
+ )
52
+ ```