【问题标题】:Missing Right Parenthesis error while executing this query in oracle在 oracle 中执行此查询时缺少右括号错误
【发布时间】:2016-04-28 16:40:18
【问题描述】:

我在 oracle 中执行这个查询,它在第 33 行给我一个缺少右括号的错误。有没有人可以帮助我解决这个问题。谢谢 这是我的查询

WITH t AS (
  SELECT RM_LIVE.EMPLOYEE.EMPNO,
         RM_LIVE.EMPNAME.FIRSTNAME,
         RM_LIVE.EMPNAME.LASTNAME,
         RM_LIVE.CRWBASE.BASE,
         RM_LIVE.CRWCAT.crwcat,
         RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC
  FROM   RM_LIVE.EMPBASE,
         RM_LIVE.EMPLOYEE,
         RM_LIVE.CRWBASE,
         RM_LIVE.EMPNAME,
         RM_LIVE.CRWSPECFUNC,
         RM_LIVE.EMPSPECFUNC,
         RM_LIVE.EMPQUALCAT,
         RM_LIVE.CRWCAT
  where  RM_LIVE.EMPBASE.IDEMPNO = RM_LIVE.EMPLOYEE.IDEMPNO
  AND    RM_LIVE.EMPBASE.IDCRWBASE = RM_LIVE.CRWBASE.IDCRWBASE
  AND    RM_LIVE.EMPLOYEE.IDEMPNO = RM_LIVE.EMPNAME.IDEMPNO 
  AND    RM_LIVE.EMPSPECFUNC.IDCRWSPECFUNC =RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC  
  AND    RM_LIVE.EMPSPECFUNC.IDEMPNO =RM_LIVE.EMPLOYEE.IDEMPNO
  AND    RM_LIVE.EMPQUALCAT.IDEMPNO=RM_LIVE.EMPLOYEE.IDEMPNO 
  AND    RM_LIVE.CRWCAT.IDCRWCAT = RM_LIVE.EMPQUALCAT.IDCRWCAT
  AND    RM_LIVE.CRWCAT.crwcat IN ('CP','FO','CM','MC')
  AND    RM_LIVE.CRWBASE.BASE <> 'XYZ'
  AND    RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN  
                ('921','2' ,'1','301','17','4','3','7','302' ,'861','31',
                 '723','30','722 ','29 ','721','16','601','581')  
  AND    RM_LIVE.EMPBASE.STARTDATE <= SYSDATE
  AND    RM_LIVE.EMPBASE.ENDDATE >= SYSDATE
  AND    RM_LIVE.EMPSPECFUNC.STARTDATE <= SYSDATE
  AND    RM_LIVE.EMPSPECFUNC.ENDDATE >= SYSDATE
  AND    RM_LIVE.EMPNAME.FROMDATE <=SYSDATE
  AND    RM_LIVE.EMPQUALCAT.STARTDATE <= SYSDATE
  AND    RM_LIVE.EMPQUALCAT.ENDDATE >= SYSDATE AS ta  (EMPNO,EMPFIRSTNAME,EMPLASTNAME, Base, CAT, code)
) 
SELECT  DISTINCT
        t.EMPNO,
        t.EMPFIRSTNAME,
        t.EMPLASTNAME,
        t.Base,
        t.CAT, 
        (ABS(oa.val1) * NVL(NULLIF((ABS(oa.val2) * ABS(oa.val3)),0),1) * ABS(oa.val4)  * ABS(oa.val5) * ABS(oa.val6) * ABS(oa.val7) * ABS(oa.val8) * ABS(oa.val9)) AS "FTE VALUE"
 FROM   t
    OUTER APPLY (SELECT MAX(CASE WHEN t2.code IN (1,2,4) THEN 0.70 ELSE -1 END) AS val1,
                        MAX(CASE WHEN t2.code IN (1,2) THEN 0  ELSE -1 END) AS val2,
                        MAX(CASE WHEN t2.code IN (4) THEN 1.29  ELSE -1 END) AS val3,
                        MAX(CASE WHEN t2.code IN ( 861 ) THEN 0.80  ELSE -1 END) AS val4
                        MAX(CASE WHEN t2.code IN (921,301,30,722,601,581) THEN 0.50   ELSE -1 END) AS val5
                        MAX(CASE WHEN t2.code IN (17,302,16) THEN 0.85 ELSE -1 END) AS val6
                        MAX(CASE WHEN t2.code IN (29,721) THEN 0.25 ELSE -1 END) AS val7
                        MAX(CASE WHEN t2.code IN (31,723) THEN 0.75 ELSE -1 END) AS val8
                        MAX(CASE WHEN t2.code IN (3,7) THEN 0.90 ELSE -1 END) AS val9
                  FROM t AS t2 WHERE t2.EMPNO = t.EMPNO) oa

【问题讨论】:

  • 请不要混合使用旧式(逗号)连接和 ANSI/ISO 连接 - 只需将所有内容转换为 ANSI 连接即可(查看表之间的关系要容易得多)。
  • OUTER APPLY 是做什么的?那是来自另一个 DBMS 的语法吗? AS ta (EMPNO,EMPFIRSTNAME,EMPLASTNAME, Base, CAT, code) 应该做什么?
  • @AlexPoole OUTER APPLY 似乎是 12c feature - 但是,OP 只标记了早期版本的 Oracle。
  • @MTO - 是的,刚刚在new features 中找到了,谢谢。我真的必须开始掌握 12c...

标签: oracle oracle11g oracle10g


【解决方案1】:

子查询分解 (WITH ... AS ( ... )) 子句的最后一行是:

AND    RM_LIVE.EMPQUALCAT.ENDDATE >= SYSDATE AS ta  (EMPNO,EMPFIRSTNAME,EMPLASTNAME, Base, CAT, code)

AS ta (...) 语法无效。

如果要命名列,则需要删除该部分并将第一行更改为:

WITH t (EMPNO,EMPFIRSTNAME,EMPLASTNAME, Base, CAT, code) AS (

但是,这是 Oracle 11g 中引入的语法,在 Oracle 10g 中不起作用 - 如果您想支持该版本(而且似乎您已经标记了它),那么只需为每列显式别名:

WITH t AS (
  SELECT RM_LIVE.EMPLOYEE.EMPNO,
         RM_LIVE.EMPNAME.FIRSTNAME AS EMPFIRSTNAME,
         RM_LIVE.EMPNAME.LASTNAME AS EMPLASTNAME,
         RM_LIVE.CRWBASE.BASE,
         RM_LIVE.CRWCAT.crwcat AS CAT,
         RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC AS CODE

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多