Преобразование Oracle SQL Select в PostgreSQL select - PullRequest
3 голосов
/ 15 февраля 2010

У меня есть этот оператор SQL:

SELECT ABX.ABX_APO_NUMBER,
       COUNT(A1.PROCESS_MODE) AS NUM_PLANNING,
       COUNT(A2.PROCESS_MODE) AS NUM_SETUP,
       COUNT(A3.PROCESS_MODE) AS NUM_OUTPUT
  FROM ABX, USER_INSTANCE U, ACTIVE_PROCESS A1,
       ACTIVE_PROCESS A2, ACTIVE_PROCESS A3
 WHERE U.ABX_APO_NUMBER (+) = ABX.ABX_APO_NUMBER
   AND A1.PROCESS_INSTANCE_NUMBER (+) = U.INSTANCE_NUMBER
   AND A1.PROCESS_MODE (+)= 'PLANNING'
   AND A2.PROCESS_INSTANCE_NUMBER (+) = U.INSTANCE_NUMBER
   AND A2.PROCESS_MODE (+) = 'SETUP'
   AND A3.PROCESS_INSTANCE_NUMBER (+) = U.INSTANCE_NUMBER
   AND A3.PROCESS_MODE (+) = 'OUTPUT'
 GROUP BY ABX.ABX_APO_NUMBER

(+) вызывает припадки для PG ... Могу ли я просто удалить их, и это будет означать то же самое? Что было бы эквивалентом, который понял бы Postgres?

Ответы [ 2 ]

5 голосов
/ 15 февраля 2010

Ваш запрос переписан с использованием синтаксиса ANSI-92 JOIN:

  SELECT a.abx_apo_number,
         COUNT(ap1.process_mode) AS NUM_PLANNING,
         COUNT(ap2.process_mode) AS NUM_SETUP,
         COUNT(ap3.process_mode) AS NUM_OUTPUT
     FROM ABX a
LEFT JOIN USER_INSTANCE u ON u.abx_apo_number = a.abx_apo_number
LEFT JOIN ACTIVE_PROCESS ap1 ON ap1.process_instance_number = u.instance_number
                            AND ap1.process_mode = 'PLANNING'
LEFT JOIN ACTIVE_PROCESS ap2 ON ap2.process_instance_number = u.instance_number
                            AND ap2.process_mode = 'SETUP'
LEFT JOIN ACTIVE_PROCESS ap3 ON ap3.process_instance_number = u.instance_number
                            AND ap3.process_mode = 'OUTPUT'
 GROUP BY a.abx_apo_number

(+) - это специфичный для Oracle синтаксис LEFT OUTER JOIN. Чтобы удалить его, потребуется, чтобы у каждого USER_INSTANCE.instance_number были значения для всех трех режимов процесса: PLANNING, SETUP и OUTPUT - пропустите один, и значение abx_apo_number не будет отображаться в выходных данных.

1 голос
/ 15 февраля 2010

Нет, вы не можете просто удалить их!

(+) - это старое обозначение OUTER JOIN.

Например

...
  FROM USER_INSTANCE U, ACTIVE_PROCESS A1
 WHERE A1.PROCESS_INSTANCE_NUMBER (+) = U.INSTANCE_NUMBER
   AND A1.PROCESS_MODE (+)= 'PLANNING'
...

должно быть изменено на

...
FROM USER_INSTANCE U
LEFT JOIN ACTIVE_PROCESS A1
     ON (     A1.PROCESS_INSTANCE_NUMBER = U.INSTANCE_NUMBER
          AND A1.PROCESS_MODE = 'PLANNING'
        )
...
...