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 表示它不是作为连接执行此操作,而是作为子查询执行此操作。我不确定为什么,至少在这种情况下;我被告知的一切都说它应该隐式地将其转换为连接。