Sas “where…”的最大值或参数数。。。在Proc SQL中的(…)`子句中?

Sas “where…”的最大值或参数数。。。在Proc SQL中的(…)`子句中?,sas,proc-sql,Sas,Proc Sql,假设我正在对一个表进行子集设置,并在procsql中对其进行汇总。代码使用,其中。。。在子句和子查询中进行子集设置。我知道一些SQL引擎会对的参数数量设置一些限制,其中。。。在子句中。SAS对此有限制吗?这个问题适用于这样的项目: proc sql; create table want as select ID, sum(var1) as var1, sum(var2) as var2, sum(var3) as v

假设我正在对一个表进行子集设置,并在
procsql
中对其进行汇总。代码使用
,其中。。。在
子句和子查询中进行子集设置。我知道一些SQL引擎会对
的参数数量设置一些限制,其中。。。在
子句中。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
返回10000个ID怎么办?10000000行怎么样?

正如Joe所说,
长列表中的任何合理行数可能都没有问题。然而,尽管这可能是可读的

您是否强烈倾向于按编写的方式运行查询,而不是执行左连接,例如

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中任何一条语句的长度有任何限制,但根据您的版本和提交方式,每个代码行的长度都有限制。我怀疑可以将一条长语句拆分为几行,每行都接近允许的最大长度。

正如Joe所说,在
longlist
表中合理的行数应该没有问题。然而,尽管这可能是可读的

您是否强烈倾向于按编写的方式运行查询,而不是执行左连接,例如

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中任何一条语句的长度有任何限制,但根据您的版本和提交方式,每个代码行的长度都有限制。我怀疑有可能将一条长语句拆分为几行,每行都接近允许的最大长度。

我不知道有任何明确的限制。SAS的SQL解析器似乎经常将它们转换为联接,而不是在表中显式编码;这意味着存在一些限制,但不是特别小的限制

我确实相信SQL语句的总长度是有限制的,因此如果您试图在文本中包含一个非常长的列表,您可能会遇到问题,但是在上面的示例中,我没有看到10000000 ID的问题。我刚刚用longlist表中的250000000个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;

有趣的是,adding _方法表明它不是作为联接,而是作为子查询。我不知道为什么,至少在这种情况下;我被告知的一切都表明它应该隐式地将此转换为联接。

我不知道对此有任何明确的限制。SAS的SQL解析器似乎经常将它们转换为联接,而不是在表中显式编码;这意味着存在一些限制,但不是特别小的限制

我确实相信SQL语句的总长度是有限制的,因此如果您试图在文本中包含一个非常长的列表,您可能会遇到问题,但是在上面的示例中,我没有看到10000000 ID的问题。我刚刚用longlist表中的250000000个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;

有趣的是,adding _方法表明它不是作为联接,而是作为子查询。我不知道为什么,至少在这种情况下;我被告知的一切都表明,它应该隐式地将此连接转换为连接。

我希望,如果您从SAS连接到另一个rdbms,它可能会自动转换。是什么让您期望SAS本身能够做到这一点?@user667489 SAS
proc sql
与其他RDBMS一样,是一个sql优化器/解释器/编译器;毕竟,任何类型的SQL都是一种声明性语言,因此解释器将做各种事情来优化查询。SAS的优化器不如SQL Server的好,但仍然相当不错。将
中的子查询
转换为联接在任何类型的SQL中都是一种非常常见的优化。我希望如果您从SAS连接到另一个rdbms,它很可能会自动转换。是什么让您期望SAS本身能够做到这一点?@user667489 SAS
proc sql
与其他RDBMS一样,是一个sql优化器/解释器/编译器;毕竟,任何类型的SQL都是一种声明性语言,因此解释器将做各种事情来优化查询。SAS的优化器不如SQL Server的好,但仍然相当不错。将
中的子查询转换为联接在任何类型的SQL中都是一种非常常见的优化。没有强烈的偏好。这个问题并不是关于如何做某事,只是为了确认这个特殊的语法并不危险。谢谢你的信息!没有强烈的偏好。这个问题并不是关于如何做某事,只是为了确认这个特殊的语法并不危险。谢谢你的信息!