以下是在 ORACLE 中编写的查询,用于给出上一行,最后给出输出。 如何在 MS Access 中构建以下 ORACLE 查询,特别是 ROWNUM 部分..感谢您的输入
orcl> WITH d
2 AS (SELECT ROWNUM rn,
3 dname,
4 deptno
5 FROM (SELECT dname,
6 deptno
7 FROM dept
8 ORDER BY dname)),
9 e
10 AS (SELECT ROWNUM + 1 rn,
11 dname,
12 deptno
13 FROM (SELECT dname,
14 deptno
15 FROM dept
16 ORDER BY dname))
17 SELECT rn,
18 d.dname,
19 d.deptno this_row,
20 e.deptno previous_row
21 FROM d
22 left outer join e USING (rn)
23 ORDER BY dname;
RN DNAME THIS_ROW previous_ROW
1 ACCOUNTING 10
2 OPERATIONS 40 10
3 RESEARCH 20 40
4 SALES 30 20
最佳答案
对于您的查询使用的某些 Oracle 功能,Access SQL 没有直接对应项,因此您无法将其“翻译”到 Access。相反,您必须从头开始重写它。
您可以使用 DMax()
表达式返回“前一个”dname
。
SELECT
dname,
deptno AS this_row,
DMax("dname", "dept", "dname < '" & [dname] & "'")
AS previous_dname
FROM dept;
该查询返回此结果集:
dname this_row previous_dname
ACCOUNTING 10
OPERATIONS 40 ACCOUNTING
RESEARCH 20 OPERATIONS
SALES 30 RESEARCH
然后将该结果集左连接回 dept
表,该连接基于 previous_dname = dname
。
SELECT
d1.dname,
d1.this_row,
d2.deptno AS previous_row
FROM
(
SELECT
dname,
deptno AS this_row,
DMax("dname", "dept", "dname < '" & [dname] & "'")
AS previous_dname
FROM dept
) AS d1
LEFT JOIN dept AS d2
ON d1.previous_dname = d2.dname
ORDER BY d1.dname;
我省略了 rn
(ROWNUM) 列,因为使用此方法进行连接不需要它。但是,如果您出于其他原因仍然需要/想要它,可以使用 DCount()
表达式派生它。
SELECT
d1.rn
d1.dname,
d1.this_row,
d2.deptno AS previous_row
FROM
(
SELECT
DCount("*", "dept", "dname <= '" & [dname] & "'")
AS rn
dname,
deptno AS this_row,
DMax("dname", "dept", "dname < '" & [dname] & "'")
AS previous_dname
FROM dept
) AS d1
LEFT JOIN dept AS d2
ON d1.previous_dname = d2.dname
ORDER BY d1.dname;
关于ms-access - MS Access 中的等效查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12066896/