変更情報TBLの結合条件orWHERE句で、「旧連番、旧カード番号が同じデータの中で最大の変更日」のデータを指定する条件を追加すると、旧連番が3旧カード番号が00010001のデータも変更日2018/08/20のデータで更新することができます。
SQL
1INNER JOIN 変更情報TBL AS changes ON
2 customer.カード番号 = changes.旧カード番号 AND
3 customer.連番 = changes.旧連番
4 changes.変更日 = (「旧連番、旧カード番号が同じデータの中で最大の変更日」を取得するサブクエリ);
サブクエリの書き方は色々とあると思うので、ご自身で考えてみて下さい。
↓↓↓追記↓↓↓
sazi様の回答にあるようにWITH RECURSIVEを使用する方法で解決できそうです。
SQL
1WITH RECURSIVE OKYAKUSAMA AS (
2 SELECT '0001' AS ID, 1 AS RENNBANN, '0001001' AS CARDNO
3 UNION
4 SELECT '0001' AS ID, 3 AS RENNBANN, '0001001' AS CARDNO
5 UNION
6 SELECT '0005' AS ID, 4 AS RENNBANN, '0001010' AS CARDNO
7)
8, HENNKOU AS (
9 SELECT '1001' AS ID, 1 AS RENNBANN, '1001003' AS CARDNO, '1001' AS KYUUID, 2 AS KYUURENNBANN, '1001003' AS KYUUCARDNO, TO_TIMESTAMP('2018/08/20 12:00:00', 'YYYY/MM/DD HH24:MI:SS') AS HENKOUBI
10 UNION
11 SELECT '1001' AS ID, 2 AS RENNBANN, '1001003' AS CARDNO, '0001' AS KYUUID, 3 AS KYUURENNBANN, '0001001' AS KYUUCARDNO, TO_TIMESTAMP('2018/08/01 11:00:00', 'YYYY/MM/DD HH24:MI:SS') AS HENKOUBI
12 UNION
13 SELECT '1005' AS ID, 5 AS RENNBANN, '1001005' AS CARDNO, '0005' AS KYUUID, 4 AS KYUURENNBANN, '0001010' AS KYUUCARDNO, TO_TIMESTAMP('2018/08/20 13:00:00', 'YYYY/MM/DD HH24:MI:SS') AS HENKOUBI
14)
15, TAISYO(ID, RENNBANN, CARDNO, MOTOID, MOTORENNBANN, MOTOCARDNO, DEPTH) AS (
16 SELECT CHANGES.ID, CHANGES.RENNBANN, CHANGES.CARDNO, CUSTOMER.ID AS MOTOID, CUSTOMER.RENNBANN AS MOTORENNBANN, CUSTOMER.CARDNO AS MOTOCARDNO, 1 AS DEPTH
17 FROM OKYAKUSAMA AS CUSTOMER
18 INNER JOIN HENNKOU AS CHANGES
19 ON CUSTOMER.ID = CHANGES.KYUUID
20 AND CUSTOMER.RENNBANN = CHANGES.KYUURENNBANN
21 AND CUSTOMER.CARDNO = CHANGES.KYUUCARDNO
22 UNION ALL
23 SELECT CHANGES.ID, CHANGES.RENNBANN, CHANGES.CARDNO, TAISYO.MOTOID, TAISYO.MOTORENNBANN, TAISYO.MOTOCARDNO, DEPTH + 1
24 FROM HENNKOU AS CHANGES, TAISYO
25 WHERE TAISYO.ID = CHANGES.KYUUID
26 AND TAISYO.RENNBANN = CHANGES.KYUURENNBANN
27 AND TAISYO.CARDNO = CHANGES.KYUUCARDNO
28)
29SELECT SUB_TAISYO.ID, SUB_TAISYO.RENNBANN, SUB_TAISYO.CARDNO
30FROM OKYAKUSAMA, (
31 SELECT SUB.*
32 FROM (SELECT TAISYO.*, MAX(TAISYO.DEPTH) OVER(PARTITION BY TAISYO.MOTOID, TAISYO.MOTORENNBANN, TAISYO.MOTOCARDNO) MAX_DEPTH FROM TAISYO) SUB
33 WHERE SUB.DEPTH = SUB.MAX_DEPTH
34 ) SUB_TAISYO
35WHERE OKYAKUSAMA.ID = SUB_TAISYO.MOTOID
36 AND OKYAKUSAMA.RENNBANN = SUB_TAISYO.MOTORENNBANN
37 AND OKYAKUSAMA.CARDNO = SUB_TAISYO.MOTOCARDNO
WITH句のOKYAKUSAMAとHENNKOUはお客様TBLと変更情報TBLをインラインで表現しているだけなので読み飛ばして下さい。(当方の環境にテーブル作成するのが面倒であったので了承下さい。。)
TAISYOの部分がWITH RECURSIVEの構文を使用している部分です。
まず、非再帰的表現部分でお客様TBLのキーと変更情報TBLの旧キーが同じデータを抽出しています。ここで、お客様情報のキーを元キー(MOTOID, MOTORENNBANN, MOTOCARDNO)として保持しています。さらに、深さを表すDEPTHを1として定義しています。
再帰的表現部分では、非再帰的表現部分で取得できた結果の変更情報TBLのキーが変更情報TBLの旧キーと同じデータを抽出しており、これを繰り返します。繰り返すたびDEPTHは加算されます。
その結果は以下のようになります。
SQLの結果
1ID;RENNBANN;CARDNO;MOTOID;MOTORENNBANN;MOTOCARDNO;DEPTH
2"1001";2;"1001003";"0001";3;"0001001";1
3"1001";1;"1001003";"0001";3;"0001001";2
4"1005";5;"1001005";"0005";4;"0001010";1
WITH以降のSELECT句でこの結果からお客様TBLのキーと元キーが同じ、かつ、深さが最大のデータを取得すると更新対象とその更新値が取得できます。
他にもやり方はあるかと思いますが、私のつたないSQLではこれが限界でした。。。
わかりづらい部分が多いと思いますし、やり方はこれだけではないはずなので、ご自身に合った方法を見つけて課題解決下さい。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。