2016-04-28 4 views
0

oracleでこの問合せを実行していますが、33行目に右括弧が欠落しているというエラーが表示されます。ここで は私のクエリはoracleでこの問合せを実行中に右括弧エラーが表示される

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 
+1

をレガシー(カンマ)を混ぜないでください加わり、ANSI/ISOは加入 - ちょうどすべてをANSI結合に変換します(テーブルがどのように関連しているかを見るのがずっと簡単です)。 – MT0

+0

「OUTER APPLY」は何をしますか?他のDBMSからのその構文ですか?そして、「AS ta(EMPNO、EMPFIRSTNAME、EMPLASTNAME、ベース、CAT、コード)は何をしていますか? –

+1

@AlexPoole「OUTER APPLY」は[12c機能](https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#BABJHDDA)であるように見えますが、OPには以前のバージョンのOracle 。 – MT0

答えて

1

でいただきありがとうございますあなたのサブクエリファクタリングの最後の行(WITH ... AS (...))句です:

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

AS ta (...)は無効な構文です。

あなたが列を名前を付けたい場合、あなたはその部分を削除し、に最初の行を変更する必要があります。しかし、それは、Oracle 11gで導入された構文であり、Oracle 10gでは動作しません

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

- あなたは、各列に別名そしてちょうど明示的に(そして、あなたがそれをタグ付けしましたので、あなたがやるようだ)、そのバージョンをサポートする場合:

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 
関連する問題