2010-02-15 2 views
1

У меня есть два операторов выбора, что я пытаюсь порта из Oracle в Postgres:Преобразования 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, чтобы понять, что это эквивалентно тому, что.

+1

Вы задали очень похожий вопрос здесь: http://stackoverflow.com/questions/2268732/converting-oracle-sql-select-into-posgresql-select –

ответ

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 или просто опустить часть (+).

0

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

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

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

+2

Оригинальный программист использует предикаты типа 'MO.MO_MSN_CLASS_NM = 'TOP '', что никогда не может быть выполнено для поддельных записей, возвращаемых' LEFT JOIN'. Вероятно, у него были некоторые причины, но запрос, как он писал (не так, как он имел в виду), идентичен «INNER JOIN». – Quassnoi

+0

Когда вы используете предложение where (отличное от того, где b.my_id равно null), которое находится из таблицы в правой части левого соединения (того, из которого вы ожидаете получить нулевые записи), вы конвертируете его в внутреннее соединение. Возможно, это было не намеренно, но это то, что запрос вернется. Эти условия должны быть в соединении (например: на a.myid = b.myid и b.myfield = 2), чтобы сохранить левое соединение как левое соединение. – HLGEM

Смежные вопросы