私のソースが次のように見えると仮定します
X1 H_ID l1_no l2_no l3_no
20 1 2 12 42
20 1 6 16 42
20 1 1 19 41
20 1 5 15 41
そして、私のルックアップテーブルは次のようになります
X1 H_ID l1_no l1_key l2_no l2_key l3_no l3_key
20 1 4 104 14 114 44 144
20 1 3 103 13 113 43 143
20 1 1 101 11 111 41 141
20 1 2 102 12 112 42 142
この場合、完全に一致し、完全なキーが保持される場合にのみ、私のレコードは更新と見なされます。どの列にも一致しない場合は、挿入と見なされます。トリッキーな部分は挿入の場合でもあり、すべての階層レベルをチェックする必要があり、一致するビットのためにキーを保持する必要があります。
たとえば、すでに 1->11->14 があり、1->11->15 を確認すると、これは挿入レコードである必要がありますが、1 と 11 のキーは保持する必要があり、15 の場合は生成する必要があります。
また、1->12->14 を取得した場合、この場合、レコードは挿入と見なされ、キーは 1 に対してのみ保持する必要があり、12 と 14 に対して新しいキーを生成する必要があります
私が考えることができる 1 つの可能な解決策は、データ セットを 2D マトリックスとして扱うことによって、各レベルの左結合を行うことです。しかし、それは素晴らしい方法ではありません。
WITH lookup ( x1, h_id, l1_no, l1_key, l2_no, l2_key,l3_no,l3_key ) AS
(SELECT 20, 1, 1, 101, 11, 111, 41, 141 FROM sys.dual UNION ALL
SELECT 20, 1, 2, 102, 12, 112, 42, 142 FROM sys.dual UNION ALL
SELECT 20, 1, 3, 103, 13, 113, 43, 143 FROM sys.dual UNION ALL
SELECT 20, 1, 4, 104, 14, 114, 44, 144 FROM sys.dual),
dwh_keys AS
(SELECT x1, h_id, MAX(l1_key) mk1, MAX(l2_key) mk2, MAX(l3_key) mk3
FROM lookup GROUP BY 1,2) ,
src ( x1, h_id, l1_no, l2_no, l3_no ) AS
(SELECT 20, 1, 1, 19, 41 FROM sys.dual UNION ALL
SELECT 20, 1, 2, 12, 42 FROM sys.dual UNION ALL
SELECT 20, 1, 5, 15, 41 FROM sys.dual UNION ALL
SELECT 20, 1, 6, 16, 42 FROM sys.dual),
stg1 AS
(SELECT b.*,
CASE WHEN a.x1 IS NOT NULL THEN 'U' ELSE 'I' END AS delta_type
FROM src b LEFT OUTER JOIN lookup a ON a.x1 = b.x1 AND a.h_id = b.h_id
AND a.l1_no = b.l1_no AND a.l2_no = b.l2_no AND a.l3_no = b.l3_no)
SELECT a.*,
CASE WHEN delta_type = 'I' AND b.l1_no IS NULL THEN mk1 + ROW_NUMBER ( ) OVER (ORDER BY delta_type) ELSE b.l1_key END AS new1_key,
CASE WHEN delta_type = 'I' AND c.l2_no IS NULL THEN mk2 + ROW_NUMBER ( ) OVER (ORDER BY delta_type) ELSE c.l2_key END AS new1_key,
CASE WHEN delta_type = 'I' AND d.l3_no IS NULL THEN mk3 + ROW_NUMBER ( ) OVER (ORDER BY delta_type) ELSE d.l3_key END AS new1_key,
delta_type
FROM stg1 a
LEFT OUTER JOIN lookup b ON a.x1 = b.x1 AND a.h_id = b.h_id AND a.l1_no = b.l1_no
LEFT OUTER JOIN lookup c ON a.x1 = c.x1 AND a.h_id = c.h_id AND a.l1_no = c.l1_no AND a.l2_no = c.l2_no
LEFT OUTER JOIN lookup d ON a.x1 = d.x1 AND a.h_id = d.h_id AND a.l1_no = d.l1_no AND a.l2_no = d.l2_no AND a.l3_no = d.l3_no
LEFT OUTER JOIN dwh_keys xx ON a.x1 = xx.x1 AND a.h_id = xx.h_id;
私が得る出力(また私が欲しいもの)
X1 H_ID L1_NO L2_NO L3_NO DELTA_TYPE NEW1_KEY NEW1_KEY NEW1_KEY DELTA_TYPE
20 1 6 16 42 I 105 115 145 I
20 1 5 15 41 I 106 116 146 I
20 1 1 19 41 I 101 117 147 I
20 1 2 12 42 U 102 112 142 U
私のデータベースWX2
は再帰 CTE をサポートしていません。私が持っているのは再帰 CTE を除いて単純な ANSI SQL 構文だけです。