2010-02-15 69 views
2

我有这样的SQL语句:转换的Oracle SQL SELECT INTO PosgreSQL选择

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会理解什么?

回答

4

这里是你的查询中使用重新编写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 - 省略1,并且abx_apo_number不会显示在输出中。

+0

+1为整个方式:) – 2010-02-15 20:45:43

1

不,你不能把它们删除! (+)是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' 
     ) 
...