USER_ID を介した USER_ACTIVITY_FACT など、そのデータベース内の他のテーブルへの参照を持つデータベース内の USER_DIM テーブルに関する問題。
テーブルの元の設計が、実際には別のデータベースの EXTERNAL_ID に由来する適切な一意の識別子を使用しなかった場合に、問題が発生します。
余分な行を選択または削除する方法はわかりますが、他のテーブルの行を更新して元の USER_ID を指すようにしてから、USER_DIM テーブルの余分な行を削除したいと考えています。
SELECT ACTIVITY_FACT.USER_ID
FROM USER_ACTIVITY_FACT
WHERE USER_ACTIVITY_FACT.USER_ID IN (
select USER_ID
FROM USER_DIM
WHERE EXTERNAL_ID IN (SELECT ud2.EXTERNAL_ID
FROM USER_DIM as ud2
where USER_ID > ud2.USER_ID));
これらを最小の USER_ID になるように更新します
次に、USER_DIM で削除ステートメントを実行します。
DELETE
FROM USER_DIM
WHERE EXTERNAL_ID IN (SELECT ud2.EXTERNAL_ID
FROM USER_DIM as ud2
where USER_ID > ud2.USER_ID);
その後、テーブルを ALTER して、EXTERNAL_ID 列に一意のインデックスを付けます。
このクエリは、問題のある余分な USER_ID に対して複数の行を一度に更新するよりも、行ごとに更新される可能性があります。
よろしくお願いします。
更新 目的を明確にするには:
USER_ACTIVITY_FACT
-------------
USER_ID
2
3
4
5
6
USER_DIM
--------------
USER_ID EXTERNAL_ID
2 23
3 23
4 24
5 24
6 26
..結果は次のようになります
USER_ACTIVITY_FACT
-------------
USER_ID
2
2
4
4
6
USER_DIM
--------------
USER_ID EXTERNAL_ID
2 23
4 24
6 26
お役に立てれば