什么是SPSS部分外部联接的SQL等价物?

时间:2016-08-10 18:22:36

标签: sql oracle spss

我正在开发一个项目,将旧的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提供以下维恩图:

enter image description here

似乎复制此方法的最佳方法是在表A和C之间进行完全外连接,然后将外连接从A连接到C,将B连接到C.

这是对的吗?有更好的解决方案吗?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用以下命令在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中的一个匹配的记录将返回。

答案 2 :(得分:0)

文档一点也不清楚。当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.?;