散列返回整个表-SAS

散列返回整个表-SAS,sas,Sas,我在数据步骤中使用了一个哈希查询,如下所示: if _n_ = 1 then do; if 0 then set TableA; declare hash A(dataset: "TableA"); A.definekey ("UniqueKeyA" ); A.definedata ("DataA" ); A.definedone(); end; if _n_ = 1 then do; if 0 then se

我在数据步骤中使用了一个哈希查询,如下所示:

if _n_ = 1 then do;
    if 0 then 
        set TableA;
    declare hash A(dataset: "TableA");
    A.definekey ("UniqueKeyA" );
    A.definedata ("DataA" );
    A.definedone();
end;

if _n_ = 1 then do;
    if 0 then 
        set TableB;
    declare hash B(dataset: "TableB");
    B.definekey ("UniqueKeyB" );
    B.definedata ("DataB" );
    B.definedone();
end;

rcA = A.find(key:UniqueKeyA);
rcB = B.find(key:UniqueKeyB);
当我运行查询时,
TableA
返回
rcA
和预期的数据,但是由于某种原因,
TableB
的散列会将
TableB
中的每一列都带到一起。这些查询在我看来是相同的,我想不出表之间有什么本质上的不同会导致它们的行为不同,但我对SAS了解不多

如果我的原始表是

UniqueKeyA      UniqueKeyB
    1                A
    2                B
    3                C
而TableA是

UniqueKeyA    [...Other TableA columns...]   DataA
    1                                          53
    3                    ...                   46
表B是

UniqueKeyB    [...Other TableB columns...]   DataB
    B                                         .45
    C                    ...                  .22
我的结果表是

UniqueKeyA      UniqueKeyB   rcA   DataA   rcB   [...Other TableB columns...]   DataB
    1                A        0      53     21
    2                B       513            0                                     .45
    3                C        0      46     0               ...                   .22
这对我来说没有意义,因为散列看起来非常基本,虽然它们是相同的,但它们中只有一个返回每一列

如果您需要更多信息,请告诉我,谢谢

此外,我还有另一个问题,关于将值输入数据列的相同散列,即使,
rcA
不等于0。这个问题在这里:

这一行:

if 0 then 
        set TableB;
就是这些列的来源。这是一种“懒惰”的方法,可以避免在散列创建之前没有对变量进行技术初始化的情况下,从散列创建中出现未初始化的变量消息。如果你把每个变量都带进来就可以了,但是如果你只带了2个变量,而你有40个变量,那么你就得到了38个你不太想要的额外变量。它们是空的,但仍然不需要


(keep=uniquekey-datab)
添加到set TableB语句中,它应该可以去掉那些其他列。

太棒了,谢谢!是否有任何原因,它可能会这样做,只有一个表?创建哈希或调用find方法的顺序并没有改变它始终是TableB的事实。不过这很有帮助——我不是一个SAS用户,我正在修改别人的代码,我会把它改成你不那么懒惰的方式。有时候SAS中的散列对象表现得很奇怪。有一次,我在同一个数据步骤中遇到了两个哈希问题。他们的名字有点像hname1和hname2,所以他们名字中只有最后的符号是不同的。每次我运行这个程序,我都会收到一个错误,不是通常的错误,有合理的描述,但类似“内存不足……诸如此类……出现了错误……任务回溯……诸如此类”。当我给他们起的名字差别更大时,一切都很理想!所以,我只是想一想——试着给你的散列取一个比a和B更长的名字。听起来很奇怪,但谁知道呢:)听起来很糟糕!我的代码中的实际表有更多不同的名称,但知道散列对象有时可能表现得很奇怪是很有用的。@AndyPhillips,很可能表中没有任何额外的变量。如果不是这样,tableA也会这样做。@Joe tableA实际上有许多列,而不是散列中引用的列。这也是造成这种情况如此混乱的部分原因——它只发生在一个表中,而不是另一个表中,但语句基本上是相同的。