proc sql 内部连接行为和必需的 select 语句

proc sql inner join behavior and required select statements

我最近开始使用 SAS,只接受了不涉及过程的基础培训 sql。我想在有空的时候阅读更多有关 SAS sql 的内容。 现在,我找到了我想做的事情的解决方案,但我很难理解正在发生的事情。

当我想找出我的数据集中的哪些主题对所有他们的记录具有特定价值时,我的问题就开始了。我使用了我以前编写的我认为我理解的代码片段。我只是尝试添加更多变量并按语句分组:

data have;
    input subject:. myvar:1. mycount:1.;
    datalines;
    a 1 1
    a 0 2
    a 0 3
    b 1 1
    b 0 2
    b 1 3
    c 1 1
    c 1 2 /*This subject has myvar = 1 for all its observations*/
    ;
run;

*find subjects;
proc sql;
    create table want as 
/*  select*/
/*  distinct x.subject */
/*  from */
    (select distinct subject, count(myvar) as myvar_c 
    from have where myvar = 1 group by subject) x,
    (select distinct subject, max(mycount) as max_c
    from have group by subject) y
    where x.subject = y.subject and x.myvar_c = y.max_c;
quit;

在 create table 语句中删除注释 'select distinct x.subject from' 时,上面的代码可以正常工作。

但是,我之前还创建了另一段代码,select 我的数据集中具有两种记录类型的所有受试者:

data have2;
    input subject:. mytype:1.;
    datalines;
    a 1
    a 0
    a 0
    b 1
    b 0
    b 1
    c 1
    c 1 /*This subject doesn't have two types of records in all its observations*/
    ;
run;

*Find subjects;
proc sql;
   create table want2 as select
   distinct x.subject from
      have2 x, 
      (select distinct subject, count(distinct mytype) as mytype_c from have2 group by subject) y
   where y.mytype_c = 2 and x.subject = y.subject;
quit;

这很相似,但不需要额外的 select 语句。第一个代码有 3 个 select 语句,第二个代码只需要两个 select 语句。 有人可以告诉我为什么这是必需的吗? 或者 link 给我一些很好的文档,其中列出了这些类型的连接的规范 - 任何人都可以告诉我这种类型的连接的具体名称,您只使用逗号吗?

在我写作的同时,还看到它可以使用我最初编写的代码来查找只有一种记录类型的主题并针对我当前的问题对其进行调整 >.< 但仍然想知道什么发生在第一个例子中。

SQL 连接结构

FROM ONE, TWO, THREE, …

被称为 CROSS JOIN 并且是没有条件的连接。逗号 (,) 语法在今天不太流行,建议使用以下结构

FROM ONE
CROSS JOIN TWO
CROSS JOIN THREE

结果集是笛卡尔积,行数是交叉联接表中行数的乘积。

当查询有条件(WHERE 子句)时,连接是 INNER JOIN。

Proc SQL 的 SAS 文档是一个很好的起点,其中包含示例。

joined-table Component
Joins a table with itself or with other tables or views.

Table of Contents
Syntax
Required Arguments
Optional Argument
Details
Types of Joins
Joining Tables
Table Limit
Specifying the Rows to Be Returned
Table Aliases
Joining a Table with Itself
Inner Joins
Outer Joins
Cross Joins
Union Joins
Natural Joins
Joining More Than Two Tables
Comparison of Joins and Subqueries

一般提示:

如果您想在浏览器中使用 SQL 查询来愚弄 (fiddle),请尝试访问 SQL Fiddle 网站。