Преобразование из Oracle Join в Postgres Присоединиться - PullRequest
1 голос
/ 16 февраля 2010

У меня есть два оператора 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 ]

2 голосов
/ 16 февраля 2010
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 или просто уронить (+) деталь.

0 голосов
/ 16 февраля 2010

(+) был способом выражения внешнего соединения в Oracle до того, как «LEFT JOIN» (и т. Д.) Было добавлено в стандартный SQL. Некоторые практики Oracle не сразу переключились на стандартный синтаксис, даже после того, как он был добавлен к Oracle на диалекте SQL.

В ответе, который вы приняли, говорится, что вы можете заменить «LEFT JOIN» на «INNER JOIN». Я не убежден. Но меня смущает ссылка на «MCI» в первом запросе.

У первоначального программиста, вероятно, была причина использовать внешнее соединение вместо внутреннего соединения. Возможно, вы захотите проверить и выяснить, действительна ли эта первоначальная причина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...