0

次のコードをSQLServerクエリに追加しましたが、Oracleでも同じことを行う必要があります。C#ではなくビューでグループ化を行う必要があります。このエラーメッセージが表示されます:

ORA-01747user.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;
4

2 に答える 2

2

コードにいくつか問題があります。

FACILITY_KEYまず、次の3つの列を選択し、 :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選択すると、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クエリで選択されなかった列をリストに含めることで、エラーを再現しました。

2番目の問題はCTE.DATEコラムです。DATE予約語、二重引用符である場所ですCTE."DATE"

于 2013-03-05T20:56:36.253 に答える
0

... AS [COUNT]、... AS NUMERIC(9、0))はOracle構文ではないため、機能しません。[]を削除し、NUMERICの代わりにNUMBERを使用するだけです。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 に答える