我正在开发一个项目,将旧的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.
这是对的吗?有更好的解决方案吗?
谢谢!
答案 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.?;