2013-03-05 67 views
0

我將下面的代碼添加到SQL Server查詢中,現在必須在Oracle中執行相同的操作。我需要在視圖中進行分組,而不是在C#中進行分組。我收到此錯誤消息:查詢時出現Oracle錯誤

ORA-01747無效的user.table.column或列規範。

我該如何編寫代碼才能在Oracle中工作?

SELECT CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS, COUNT(*) AS [COUNT] 
    FROM CTE 
    GROUP BY CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS; 

在查詢的開始,我有這個完整的代碼在這裏:

CREATE OR REPLACE VIEW DBD_V_CDL_CHANGES AS 
WITH CTE AS 
(
SELECT TR.FACILITY_KEY 
     , MV.VALUE_CODE 
     , CAST(COUNT(*) AS NUMERIC(9, 0)) COUNT 
    FROM OPTC.THS_T_TRANSACTIONS1 TR 
    JOIN OPTC.THS_M_MENU2 M 
     ON M.MENU_ID = TR.MENU_ID 
    JOIN OPTC.THS_M_VALUES MV 
     ON MV.MENU_ID = TR.MENU_ID_VALUE 
    JOIN OPTC.THS_M_VALUES MV2 
     ON MV2.MENU_ID = TR.PREVIOUS_MENU_ID_VALUE 
    JOIN OGEN.GEN_M_PATIENT_MAST PM 
     ON PM.PAT_NUMBER = TR.PAT_NUMBER 
    WHERE TR.TR_DATETIME BETWEEN TRUNC(SYSDATE) 
          AND TRUNC(SYSDATE) + 86399/86400 
    AND TR.EDIT_NO < 0 
    AND MV.VALUE_TYPE IS NULL 
    AND MV2.VALUE_TYPE IS NULL 
    AND MV.VALUE_CODE >= 0 
    AND MV2.VALUE_CODE >= 0 
    AND M.SUB_SYS_EXT = 'G1' 
    AND ABS(MV.VALUE_CODE - MV2.VALUE_CODE) > 1 
    AND (PM.DISCHARGE_DATE IS NULL OR PM.DISCHARGE_DATE < SYSDATE) 
    GROUP BY TR.FACILITY_KEY, MV.VALUE_CODE) 

    SELECT CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS, COUNT(*) AS [COUNT] FROM CTE 
    GROUP BY CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS; 
+0

視圖定義是不完整的。你的意思是從視圖中查詢「DBC_V_CDL_CHANGES」嗎? – Glenn 2013-03-05 20:45:55

+0

另請參閱[這裏](http://www.techonthenet.com/oracle/errors/ora01747.php)瞭解ORA-01747的解釋。它通常意味着你試圖將保留字用作列。 – 2013-03-05 20:49:25

+0

CTE或COUNT非保留字。 – Booksman 2013-03-05 20:52:27

回答

2

我看到了一些東西你的代碼錯誤。

首先,您選擇以下三列FACILITY_KEYVALUE_CODE和計數在CTE

SELECT TR.FACILITY_KEY , 
    MV.VALUE_CODE , 
    COUNT(*) as Count -- note there is no need to CAST(COUNT(*) AS NUMERIC(9, 0)) this 
FROM OPTC.THS_T_TRANSACTIONS1 TR 

但是當你選擇CTE你選擇,你是不是在CTE返回列:

with cte as 
( 
    -- your query here does not return DATE or PATIENT_STATUS 
) 
SELECT CTE.FACILITY_KEY, 
    CTE.DATE, 
    CTE.PATIENT_STATUS, 
    COUNT(*) AS COUNT 
FROM CTE 
GROUP BY CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS; 

何處來自PATIENT_STATUSDate,因爲你在你的CTE不包括他們?所以當你試圖選擇它們時,這些並不存在。

我通過在列表中包含未在CTE查詢中選擇的列來複制錯誤。

第二個問題是CTE.DATE列。 DATE是一個保留字,地方是雙引號CTE."DATE"

+0

他們來自主查詢。您有這些列是結果:FACILITY_KEY,DATE,PATIENT_STATUS – Booksman 2013-03-05 21:08:22

+0

@Booksman您在'select ... from cte'中返回的列必須位於主查詢中,並且它們不在您的列表中。您只在主查詢中返回3列。 – Taryn 2013-03-05 21:10:44

+0

@Booksman查看我的編輯。 'DATE'列是保留字,需要用雙引號。 – Taryn 2013-03-05 21:28:56

0

... AS [COUNT],... AS NUMERIC(9,0))不是Oracle語法,將永遠不會工作。只需刪除[]並使用NUMBER而不是NUMERIC。不需要CAST Count()。 Count()函數將始終返回數字,例如0-0或某個數字。

這是Oracle有效的語法:

SELECT deptno, count(*) total_count_by_dept -- no need to cast or AS -- 
    FROM scott.emp 
GROUP BY deptno 
/

儘量不要使用保留字作爲COUNT的別名:

SELECT CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS, COUNT(*) AS total_cnt -- 'AS' is for clarity only, not required 
    FROM CTE 
GROUP BY CTE.FACILITY_KEY, CTE.DATE, CTE.PATIENT_STATUS 
/
+0

作爲數字的演員工作。我測試了它,它在Oracle 11g和本演示中工作 - http://sqlfiddle.com/#!4/b8498/3 – Taryn 2013-03-05 22:06:01