第 1 行第 25 列错误:ORA-00923:未在预期位置找到 FROM 关键字

1 oracle ms-access

我有一些可以在 Access 中使用的代码,但现在我想将代码转发给我们的 IT 部门,以便在我们的 SQL 数据库中查看。

任何人都可以帮我转换它,以便它对普通 SQL 是正确的,而不是对 Access SQL 是正确的吗?

我曾尝试在 ORACLE SQL Developer 中对其进行测试,但出现错误:

第 1 行第 25 列错误:ORA-00923:未在预期位置找到 FROM 关键字

SELECT T1.*, 
       (SELECT TOP 1 T3.[SMN_DATEC]-1 
        FROM 
            (SELECT T2.[DET_NUMBERA], T2.[SMN_DATEC] 
             FROM [CHRISCS_EMSAL] AS T2 
             ORDER BY [DET_NUMBERA],[SMN_DATEC]
            ) AS T3 
        WHERE T3.[DET_NUMBERA] = T1.[DET_NUMBERA] 
          AND T3.[SMN_DATEC] > T1.[SMN_DATEC] 
       ) AS EndDate, 
       T1.[DET_NUMBERA], 
       T1.[SMN_DATEC]
FROM CHRISCS_EMSAL AS T1
ORDER BY T1.[DET_NUMBERA], 
         T1.[SMN_DATEC];
Run Code Online (Sandbox Code Playgroud)

Sen*_*nel 7

正如评论中提到的,Oracle 不喜欢标识符周围的方括号,它也不支持 TOP n 子句,但是,您可以通过一些简单的更改来解决这个问题:

SELECT T1.*, 
   (SELECT T3.SMN_DATEC-1 
    FROM 
        (SELECT T2.DET_NUMBERA
              , T2.SMN_DATEC
              , row_number() over (ORDER BY DET_NUMBERA,SMN_DATEC) AS top
         FROM CHRISCS_EMSAL T2 
        ) T3 
    WHERE T3.TOP=1
      AND T3.DET_NUMBERA = T1.DET_NUMBERA 
      AND T3.SMN_DATEC > T1.SMN_DATEC 
   ) AS EndDate, 
   T1.DET_NUMBERA, 
   T1.SMN_DATEC
FROM CHRISCS_EMSAL T1
ORDER BY T1.DET_NUMBERA, 
         T1.SMN_DATEC;
Run Code Online (Sandbox Code Playgroud)

首先删除方括号,然后将ORDER BYT3 中的子句移至ROW_NUMBER别名为的分析函数TOP,然后在标量值子查询(别名为EndDate)的外部查询TOP 1中将 select 语句中的子句更改TOP=1为 where 子句中的谓词。

也删除 ASfrom 表别名,Oracle 不允许它(但在列别名中是可以的。)


仔细检查您的代码,看起来您的标量值子查询只是获取下一个按时间顺序排列的DET_NUMERA'sSMN_DATEC并从中减去 1 天。在没有所有标量值子查询的情况下,使用 Oracle 分析函数非常容易做到这一点:

SELECT T1.*
     , LEAD(T1.SMN_DATEC-1) OVER (PARTITION BY T1.DET_NUMBERA
                                      ORDER BY T1.SMN_DATEC) EndDate
     , T1.DET_NUMBERA
     , T1.SMN_DATEC
  FROM CHRISCS_EMSAL T1
 ORDER BY T1.DET_NUMBERA, 
       T1.SMN_DATEC;
Run Code Online (Sandbox Code Playgroud)