【问题标题】:What's the SQL Equivalent of the SPSS Partial Outer Join?SPSS 部分外部联接的 SQL 等效项是什么?
【发布时间】:2016-08-10 18:22:36
【问题描述】:

我正在进行一个将旧 SPSS 系统转换为 Oracle 的项目。当前代码大量使用部分外连接,我不确定在 SQL 中复制它的最佳方法是什么。

这是一个典型查询的示例:

SELECT
    TA.A
    TB.B
    TC.C
FROM
    TABLE_A TA
    TABLE_B TB
    TABLE_C TC
PARTIAL OUTER JOIN
    TA.FIELD = TB.FIELD
    AND TB.FIELD = TC.FIELD

从我在IBM Knowledge Base 中读到的内容来看,部分外连接本质上是一个合并多个表的左/右外连接。 IBM 提供以下维恩图:

似乎最好的复制方法是在表 A 和 C 之间进行完全外连接,然后从 A 到 C 以及从 B 到 C 的左外连接。

正确吗?有没有更好的解决方案?

谢谢!

【问题讨论】:

  • 请提供样本数据和期望的结果。维恩图并不能真正传达正在发生的事情。

标签: sql oracle spss


【解决方案1】:

我在办公室四处询问,一位高级开发人员指给我this manual,它将部分外连接定义为

从主文件(第一个文件)返回所有记录 在 FROM 子句中)是否在辅助文件中存在匹配项

换句话说,取 FROM 子句中的第一个表,然后对所有其他表进行左外连接。

所以原来的查询:

 SELECT
      TA.A
      TB.B
      TC.C
 FROM
     TABLE_A TA
     TABLE_B TB
     TABLE_C TC
 PARTIAL OUTER JOIN
     TA.FIELD = TB.FIELD
     AND TB.FIELD = TC.FIELD

应该变成这样:

   SELECT
        TA.A
        TB.B
        TC.C
   FROM
      TABLE_A TA LEFT OUTER JOIN TABLE_B TB ON TA.FIELD = TB.FIELD
      LEFT OUTER JOIN TABLE_C TC ON TA.FIELD = TC.FIELD

【讨论】:

  • 这与您的维恩图不符。
【解决方案2】:

您可以在 SQL 中使用:

SELECT
    TA.A,
    TB.B,
    TC.B
FROM
    TABLE_A TA
FULL OUTER JOIN
    TABLE_B TB
    ON  (TA.FIELD = TB.FIELD)
LEFT OUTER JOIN
    TABLE_C TC
    ON  (TA.FIELD = TC.FIELD)
    OR  (TB.FIELD = TC.FIELD);

表 A 和 B 中的每条记录都会返回,即使它们不匹配。那么只有表 C 中与 A 或 B 中的一个匹配的记录才会返回。

【讨论】:

    【解决方案3】:

    文档根本不清楚。我不确定当 A 和 B 中的行与 C 中的 不同 行匹配时,SPSS 会做什么。一种可能性是

    select a.a, b.b, c.c
    from a full join
         b
         on a.? = b.? left join
         c
         on a.? = c.? or b.? = c.?;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多