2016-11-13 12 views
0

私は大きなサンプルの小さなテーブルに参加するためにいくつかのサンプルデータに対してハッシュジョインを使用しています。この例では、 '_1080544_27_08_2016'は大きな表で、 '_2015_2016_playerlistlookup'は小さい表です。私のコードは次のとおりです。ハッシュ結合は必要に応じて動作しません

data both(drop=rc); 
declare Hash Plan 
(dataset: 'work._2015_2016_playerlistlookup');        /* declare the name Plan for hash */ 
rc = plan.DefineKey ('Player_ID');           /* identify fields to use as keys */ 
rc = plan.DefineData ('Player_Full_Name', 
'Player_First_Name', 'Player_Last_Name', 
'Player_ID2');                 /* identify fields to use as data */ 
rc = plan.DefineDone();             /* complete hash table definition */ 
do until (eof1) ;               /* loop to read records from _1080544_27_08_2016 */ 
set _1080544_27_08_2016 end = eof1; 
rc = plan.add();               /* add each record to the hash table */ 
end; 
do until (eof2) ;               /* loop to read records from _2015_2016_playerlistlookup */ 
set _2015_2016_playerlistlookup end = eof2; 
call missing(Player_Full_Name, 
Player_First_Name, Player_Last_Name);          /* initialize the variable we intend to fill */ 
rc = plan.find();               /* lookup each plan_id in hash Plan */ 
output;                 /* write record to Both */ 
end; 
stop; 
run; 

これは、小さいルックアップテーブルと同じ数の行を持つテーブルを生成しています。ルックアップテーブルの追加のフィールドを持つ大きなテーブルと同じサイズのテーブルが主キーを介して結合されている場合は、何を表示したいのですか。

大きいテーブルには繰り返し主キーがあります。つまり、主キーは一意ではありません(たとえば、行番号に基づいて)。

誰かが私がコードで修正する必要があることを教えてもらえますか?あなたの最初のDOループでも同様に、次に大きなものをあなたがそれを宣言するときに小さなもの、および - あなたのハッシュオブジェクトに両方のデータセットをロードしている

おかげ

答えて

2

。大規模なデータセットの一部の行ではなく、一部の行にはすでに参照値が設定されていて、それらの行を行間に移動しようとしている場合を除き、これは意味をなさないものです。

次に、ルックアップデータセットをループし、そのデータセットの各行に対して1つの出力行を生成します。

これはハッシュオブジェクトの標準的な使用例ではないため、ここでは何をしようとしているのかは不明です。

これは私の最高の推測です。これがあなたがやろうとしていることでない場合は、サンプル入力と出力データセットを投稿してください。

data want; 
set _1080544_27_08_2016; 
if 0 then set _2015_2016_playerlistlookup; 
if _n_ = 1 then do; 
    declare Hash Plan(dataset: 'work._2015_2016_playerlistlookup');        
    rc = plan.DefineKey ('Player_ID'); 
    rc = plan.DefineData ('Player_Full_Name', 'Player_First_Name', 'Player_Last_Name', 'Player_ID2');                 
    rc = plan.DefineDone(); 
end; 
call missing(Player_Full_Name, Player_First_Name, Player_Last_Name); 
rc = plan.find(); 
drop rc; 
run; 
+0

こんにちは、お返事ありがとうございます。あなたが何を言っているのか分からないので、私に例のコードを教えてください。ありがとう。 – gdogg371

+0

私はあなたがやろうとしていることを推測しました。もしそれがあなたの望むものでなければ、サンプルデータを投稿してください。 – user667489

関連する問題