我有一些可以在 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)
正如评论中提到的,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 BY
T3 中的子句移至ROW_NUMBER
别名为的分析函数TOP
,然后在标量值子查询(别名为EndDate
)的外部查询TOP 1
中将 select 语句中的子句更改TOP=1
为 where 子句中的谓词。
也删除 AS
from 表别名,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)
归档时间: |
|
查看次数: |
1407 次 |
最近记录: |