2013-03-05 5 views
0

Следующий код я добавил к запросу SQL Server и теперь должен сделать то же самое в Oracle. Мне нужно группировать в представлении, а не в C#. Я получаю это сообщение об ошибке:Ошибка Oracle sub по запросу

ORA-01747 Недопустимая спецификация user.table.column или 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

+0

Также см. [Здесь] (http://www.techonthenet.com/oracle/errors/ora01747.php) для объяснения ORA-01747. Обычно это означает, что вы пытаетесь использовать зарезервированное слово в качестве столбца. –

+0

CTE или COUNT не зарезервированное слово. – Booksman

ответ

2

Я вижу несколько вещей неправильно с вашим кодом.

Во-первых, вы выбираете следующие три столбца FACILITY_KEY, VALUE_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 вы выбираете столбцы, которые не возвращаются в КТР :

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_STATUS и Date приходят с тех пор вы не включая их в свой CTE? Поэтому они не существуют, когда вы пытаетесь их выбрать.

Я воспроизвел вашу ошибку, включив столбцы в список, который не был выбран в запросе CTE.

Вторая проблема - колонка CTE.DATE. DATE зарезервированное слово, место, которое является двойным кавычками CTE."DATE"

+0

они исходят из основного запроса. У вас есть эти столбцы: FACILITY_KEY, DATE, PATIENT_STATUS – Booksman

+0

@Книга: столбцы, которые вы возвращаете в 'select ... from cte', должны быть в основном запросе, а они не в вашем. Вы возвращаете только 3 столбца в свой основной запрос. – Taryn

+0

@ Booksman См. Мое редактирование. Столбец 'DATE' является зарезервированным словом и должен быть в двойных кавычках. – Taryn

0

... AS [COUNT], ... AS NUMERIC (9, 0)) не является синтаксисом Oracle и никогда не будет работать. Просто удалите [] и используйте NUMBER вместо NUMERIC. Нет необходимости в CAST Count(). Функция Count() всегда будет возвращать номер, например. 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

Смежные вопросы