从Oracle Join转换为Postgres Join

时间:2010-02-15 21:46:30

标签: database oracle database-design postgresql

我有两个select语句,我试图从Oracle移植到Postgres:

1)(注意:这是较大选择的子选择部分)

SELECT 'Y'
FROM CRAFT MA, CONFIG MAC, ARMS SM
WHERE MCI.MS_INVENTORY_NUMBER = SM.MS_INVENTORY_NUMBER (+)
AND MCI.AB_BASE_ID = MA.AB_BASE_ID_LAUNCH AND SM.ACT_AC_TYPE = MAC.ACT_AC_TYPE
AND SM.MAC_ID = MAC.MAC_ID AND MAC.ACT_AC_TYPE = MA.ACT_AC_TYPE
AND MAC.MAC_ID = MA.MAC_ID_PRI

2)

SELECT ASP.ASP_SPACE_NM,
       SUM(MO.MO_TKR_TOTAL_OFF_SCHEDULED) AS "TOTAL_PLANNED"
  FROM MISSION_OBJECTIVE MO, SPACE ASP
 WHERE ASP.ASP_SPACE_NM = MO.ASP_SPACE_NM (+)
   AND MO.MO_MSN_CLASS_NM = 'TOP'
 GROUP BY ASP.ASP_SPACE_NM

(+)语法对我来说很困惑......我知道它表示“加入”,但我对SQL不太熟悉,无法理解什么等同于什么。

2 个答案:

答案 0 :(得分:2)

SELECT  'Y'
FROM    CRAFT MA
JOIN    CONFIG MAC
ON      MAC.ACT_AC_TYPE = MA.ACT_AC_TYPE
        AND MAC.MAC_ID = MA.MAC_ID_PRI
        AND MA.AB_BASE_ID_LAUNCH = MCI.AB_BASE_ID
LEFT JOIN
        ARMS SM
ON      SM.MS_INVENTORY_NUMBER = MCI.MS_INVENTORY_NUMBER
WHERE   SM.ACT_AC_TYPE = MAC.ACT_AC_TYPE
        AND SM.MAC_ID = MAC.MAC_ID AND 

SELECT ASP.ASP_SPACE_NM,
       SUM(MO.MO_TKR_TOTAL_OFF_SCHEDULED) AS "TOTAL_PLANNED"
FROM   SPACE ASP
LEFT JOIN
       MISSION_OBJECTIVE MO
ON     MO.ASP_SPACE_NM = ASP.ASP_SPACE_NM
WHERE  MO.MO_MSN_CLASS_NM = 'TOP'
GROUP BY
       ASP.ASP_SPACE_NM

我离开原始查询中的LEFT JOIN,但由于WHERE条件,这里多余。

您可以将其替换为INNER JOIN,或者只删除(+)部分。

答案 1 :(得分:0)

(+)是Oracle在将“LEFT JOIN”(等)添加到标准SQL之前表达外部联接的方式。一些Oracle从业者没有立即切换到标准语法,即使它被添加到SQL的Oracle方言中。

您接受的答案表示您可以将“LEFT JOIN”替换为“INNER JOIN”。我不相信。但我对第一个查询中对“MCI”的引用感到困惑。

原始程序员可能有使用外连接而不是内连接的原因。您可能想要检查并查看原始原因是否有效。