关于查询的Oracle子错误

时间:2013-03-05 20:38:45

标签: sql oracle

以下代码我添加到SQL Server查询中,现在必须在Oracle中执行相同的操作。我需要在视图中进行分组而不是在C#中进行分组。我收到此错误消息:

  

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;

2 个答案:

答案 0 :(得分: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"

的地方

答案 1 :(得分: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
/