我有两个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不太熟悉,无法理解什么等同于什么。
答案 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”的引用感到困惑。
原始程序员可能有使用外连接而不是内连接的原因。您可能想要检查并查看原始原因是否有效。