1

現在、整合性チェックがないため、主キー列全体で複数の重複があるテーブルがあります。とはいえ、重複を削除しようとしています。問題は、id列がないことです。つまり、重複を見つけるのは簡単ではありません。

私の現在の解決策は、count(*)... having構造を使用して2番目のテーブルを作成し、そこに削除する行を選択することです。私の問題は、SASdeleteコマンドが次のことを許可していないことです。

proc sql;
delete from TableA
where (v1,v2,v3) in TableB

別のテーブルの内容に基づいて、あるテーブルから削除する方法はありますか?

4

3 に答える 3

2

私が正しく理解している場合、複数の観測値が「キー」変数の値が同じであるデータセットからすべての観測値を削除する必要があります (すべての重複を削除します)。

SAS でこれを行う最も簡単な方法は、そのデータセットを「キー」変数で並べ替えてから、別のデータ ステップを使用して新しいコピーを作成することです。例証するよりも説明するのが難しい:

data have;
   input x y z;
   datalines4;
1 2 3
1 2 3
2 3 4
3 4 5
3 4 6
3 4 7
4 5 6
4 5 6
;;;;
run;

proc sort data=have;
   by x y z;
run;

data want;
   set have;
      by x y z;
   if  first.z and last.z;
run; 

サブセット化ステートメントは、ステートメントの使用時に作成された自動変数と変数IFを使用して、4 つの「一意の」観察のみを保持します。FIRST.LAST.BY

代わりに、重複の 1 つを保持したい場合は、次のNODUPKEYオプションを使用できPROC SORTます。

proc sort nodupkey data=have out=want2;
   by x y z;
run;

これにより、例から 2 つの観測が削除され、キーに一意の値が残ります。この手法を使用して保持される観測を制御することはできません。

于 2013-06-18T19:59:49.197 に答える
1

相関サブクエリを使用してこれを行うことができます。

proc sql;
delete from TableA
    where exists (select 1
                  from TableB
                  where b.pk = TableA.v1 or b.pk = TableA.v2 or b.pk = TableA.v3
                 )
于 2013-06-18T19:28:46.897 に答える
1

これを試して:

proc sql;
delete from TableA as a
where a.v1 = (select b.v1 from TableB as b where a.primaryKey = b.foreignKeyForTableA)

他の値についても同様です。ただし、TableB から重複 (つまり、複数の結果) を受け取る可能性があるため、「個別の選択」または「トップ 1 の選択」を試して、1 つの結果のみを取得することをお勧めします。

于 2013-06-18T19:23:50.163 に答える