【问题标题】:Converting Oracle SQL Select into PostgreSQL select将 Oracle SQL Select 转换为 PostgreSQL select
【发布时间】:2011-01-17 03:29:01
【问题描述】:

我有这个 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 可以理解的等价物是什么?

【问题讨论】:

    标签: sql database oracle postgresql plsql


    【解决方案1】:

    这是使用 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 必须具有三个进程模式的值:规划、设置和输出 - 省略一个,并且 abx_apo_number 不会显示在输出中。

    【讨论】:

      【解决方案2】:

      不,您不能只删除它们!

      (+) 是 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'
              )
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-13
        相关资源
        最近更新 更多