我对数据库编码完全陌生,我尝试过谷歌搜索,但似乎无法弄清楚。我想有个简单的解决办法。我有一个非常大的表,其中包含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亿行,并检查二级表中每一行的匹配行。这将不可避免地需要很长时间。你确定要全部读完吗?也许你需要添加一个过滤条件,但我不知道你在这方面的要求。