【问题标题】:SAS-SQL Non-Equi JoinSAS-SQL 非等值连接
【发布时间】:2019-11-05 19:01:12
【问题描述】:

我有两张桌子。当我在一个键匹配而另一个键不匹配的表上使用左连接加入它们时,我仍然收到左连接,但在两者不匹配的地方我收到重复。

data Onl;
input an ssn;
datalines;
1  1
2  1
3  1
4  2
5  2
6  2
10 6
11 7
12 8
;
run;

data Off;
input an ssn;
datalines;
1 1
2 1
4 2
5 2
7 3
8 4
9 5
;
run;

proc sql;
create table test as
select
        Onl.*
from
Onl
left join Off
on Onl.ssn = Off.ssn
and Onl.an ne Off.an
;
quit;

ne 条件的 SQL 行为是什么?我希望决赛桌由var ssn 组成,其中var an 不匹配。 预期输出的一个例子是:

an ssn
3  1
6  2
10 6
11 7
12 8

【问题讨论】:

  • “重复”是什么意思。如果 RIGHT 表中的三个观察值与 LEFT 中的观察值匹配,则该观察值将出现 3 次。如果您只是从 LEFT 表中提取变量,则 DISTINCT 关键字将消除重复项,包括消除原始 LEFT 表中的任何重复项。
  • 如果我在 SAS 中加入,我会收到两行值 3,1 和两行值 6,2。当表 Onl 最初只有 1 行而表 Off 根本不包含这些值时,为什么会有两行具有这些值?我知道解决方法。我从来没有使用过 ne 的连接,我对结果很好奇
  • 我不知道你为什么说这些价值观不存在。前两行的 SSN=1 且 AN 的值都不是 3。所以这正是你所要求的。
  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 left join 的工作原理是一个常见问题。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 请通过编辑而不是 cmets 澄清。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束和索引以及表格格式的初始化。 PS如果你想知道你的期望出了什么问题,你需要给他们。

标签: sql join sas operators


【解决方案1】:

proc sql 正在正确处理查询。 left join 返回第一个表中的所有行,无论第二个表中是否存在匹配项。

如果你想要不匹配的行,我会推荐not exists

select Onl.*
from Onl
where not exists (select 1
                  from off
                  where Onl.ssn = Off.ssn and
                        Onl.an = Off.an
                 );

可以使用joinwhere 条件来检查不匹配项:

select Onl.*
from Onl left join
     Off
     on Onl.ssn = Off.ssn and Onl.an = Off.an
where off.ssn is null;

【讨论】:

    【解决方案2】:

    NE 运算符的评估与任何其他运算符相同。因此,您的查询是说您要匹配 SSN 相同且 AN 不同的观察结果。所以 SSN=1 和 AN=3 将匹配两个 SSN=1 但不具有 AN=3 的观测值。因此,一个观测值将输出两次,因为它匹配两个观测值。 LEFT JOIN 意味着即使没有 SSN 匹配且 AN 不匹配的观测值,也会输出该观测值。

    也许您只是想使用 EXCEPT 集合操作?

    select ssn,an from ONL
    except 
    select ssn,an form OFF
    

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多