从一个表中提取记录,其中一个变量存在于另一个表中?非常大的桌子



我对数据库编码完全陌生,我尝试过谷歌搜索,但似乎无法弄清楚。我想有个简单的解决办法。我有一个非常大的表,其中包含memberid和其他一些相关变量,我想从中提取记录(table1)。我还有一个包含不同memberid的大表(table2)。我想从表1中提取table2中存在MemberID的行。

我是这样做的,由于某种原因,我怀疑这不能正常工作,或者可能有更好的方法来做到这一点。

proc sql; 
create table tablewant as select
MemberID, var1, var2, var3
from table1
where exists (select MemberID from table2)
;
quit;

我这样做有什么不对吗?当处理超大的表(超过1亿条记录)时,解决这个问题的最佳方法是什么?做某种形式的加入会更好吗?另外,我是否需要更改

where exists (select MemberID from table2)

where exists (select MemberID from table2 where table1.MemberID = table2.MemberID)

?

您想要实现一个"半连接"。第二个解决方案是正确的:

select MemberID, var1, var2, var3
from table1
where exists (
select 1 from table2 where table1.MemberID = table2.MemberID
)

指出:

  • 不需要在子查询中选择任何特殊的东西,因为它不是检查值,而是检查行是否存在。例如,1,*,甚至null都可以。为了清晰,我倾向于使用1

  • 查询需要访问table2,这应该针对如此大的表进行优化。您应该考虑添加下面的索引,如果您还没有创建它:

    create index ix1 on table2 (MemberID);
    
  • 查询没有过滤条件。这意味着引擎将读取1亿行,并检查二级表中每一行的匹配行。这将不可避免地需要很长时间。你确定要全部读完吗?也许你需要添加一个过滤条件,但我不知道你在这方面的要求。

相关内容

  • 没有找到相关文章

最新更新