0

以下代码我添加到 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;
4

2 回答 2

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_STATUS,从哪里来?因此,当您尝试选择它们时,它们不存在。DateCTE

我通过在列表中包含 CTE 查询中未选择的列来复制您的错误。

第二个问题是CTE.DATE专栏。DATE是保留字,地方就是双引号CTE."DATE"

于 2013-03-05T20:56:36.253 回答
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
/
于 2013-03-05T21:49:56.800 回答