Proc SQL 中 `where ... in (...)` 子句的最大数量或参数?
Max number or arguments to `where ... in (...)` clause in Proc SQL?
假设我要对 table 进行子集化并在 proc sql
中对其进行汇总。该代码使用 where ... in
子句和子查询来进行子集化。我知道一些 SQL 引擎会对 where ... in
子句的参数数量设置一些限制。 SAS对此有限制吗?这个问题适用于这样的程序:
proc sql;
create table want as
select
ID,
sum(var1) as var1,
sum(var2) as var2,
sum(var3) as var3
from largetable
where ID in (select ID from longlist)
group by ID;
quit;
如果 longlist
returns 10,000 个 ID 怎么办? 10,000,000 怎么样?
正如乔所说,longlist
table 中任何合理数量的行应该都没有问题。然而,尽管这可能是可读的,a join may perform better.
您是否更喜欢运行所写的查询而不是左连接,例如
proc sql;
create table want as
select
b.ID,
sum(b.var1) as var1,
sum(b.var2) as var2,
sum(b.var3) as var3
from longlist a left join largetable b
on a.ID = b.ID
group by b.ID;
quit;
详细说明如何将长列表作为文本输入 - 我不知道 SAS 中任何一条语句的长度有任何限制,但个别代码行的长度有 various limits ,具体取决于您的版本和提交方式。我怀疑可以将一个长语句拆分成几行,每行都接近允许的最大长度。
我不知道对此有任何明确的限制。 SAS 的 SQL 解析器似乎经常将它们转换为 JOIN,当它们没有在 table 中明确编码时;这意味着存在 一些 限制,但不是特别小。
我相信 SQL 语句的总长度是有限制的,所以如果你想在 text 中包含一个非常长的列表,你可能 运行 出现问题,但在上面的示例中,我没有看到 10,000,000 个 ID 的问题。我刚刚用 longlist table 中的 250,000,000 个 ID 对其进行了测试,SAS 没有问题:
data largetable;
do id=1 to 1e8;
if mod(id,7)=0 then output;
end;
run;
data ids;
do id = 1 to 1e9;
if mod(id,4)=0 then output;
end;
run;
proc sql _method;
create table want as
select
ID
from largetable
where ID in (select ID from IDs)
group by ID;
quit;
有趣的是,添加 _method 表示它不是作为连接执行此操作,而是作为子查询执行此操作。我不确定为什么,至少在这种情况下;我被告知的一切都说它应该隐式地将其转换为连接。
假设我要对 table 进行子集化并在 proc sql
中对其进行汇总。该代码使用 where ... in
子句和子查询来进行子集化。我知道一些 SQL 引擎会对 where ... in
子句的参数数量设置一些限制。 SAS对此有限制吗?这个问题适用于这样的程序:
proc sql;
create table want as
select
ID,
sum(var1) as var1,
sum(var2) as var2,
sum(var3) as var3
from largetable
where ID in (select ID from longlist)
group by ID;
quit;
如果 longlist
returns 10,000 个 ID 怎么办? 10,000,000 怎么样?
正如乔所说,longlist
table 中任何合理数量的行应该都没有问题。然而,尽管这可能是可读的,a join may perform better.
您是否更喜欢运行所写的查询而不是左连接,例如
proc sql;
create table want as
select
b.ID,
sum(b.var1) as var1,
sum(b.var2) as var2,
sum(b.var3) as var3
from longlist a left join largetable b
on a.ID = b.ID
group by b.ID;
quit;
详细说明如何将长列表作为文本输入 - 我不知道 SAS 中任何一条语句的长度有任何限制,但个别代码行的长度有 various limits ,具体取决于您的版本和提交方式。我怀疑可以将一个长语句拆分成几行,每行都接近允许的最大长度。
我不知道对此有任何明确的限制。 SAS 的 SQL 解析器似乎经常将它们转换为 JOIN,当它们没有在 table 中明确编码时;这意味着存在 一些 限制,但不是特别小。
我相信 SQL 语句的总长度是有限制的,所以如果你想在 text 中包含一个非常长的列表,你可能 运行 出现问题,但在上面的示例中,我没有看到 10,000,000 个 ID 的问题。我刚刚用 longlist table 中的 250,000,000 个 ID 对其进行了测试,SAS 没有问题:
data largetable;
do id=1 to 1e8;
if mod(id,7)=0 then output;
end;
run;
data ids;
do id = 1 to 1e9;
if mod(id,4)=0 then output;
end;
run;
proc sql _method;
create table want as
select
ID
from largetable
where ID in (select ID from IDs)
group by ID;
quit;
有趣的是,添加 _method 表示它不是作为连接执行此操作,而是作为子查询执行此操作。我不确定为什么,至少在这种情况下;我被告知的一切都说它应该隐式地将其转换为连接。