MS-Access中的等价查询

MS-Access中的等价查询,ms-access,Ms Access,下面是用ORACLE编写的查询,它给出了前一行,最后给出了输出。 如何在MS Access中的ORACLE查询下方构建框架,特别是ROWNUM部分。。感谢您的意见 orcl> WITH d 2 AS (SELECT ROWNUM rn, 3 dname, 4 deptno 5 FROM (SELECT dname, 6

下面是用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


对于您的查询使用的某些Oracle功能,Access SQL没有直接对应项,因此您无法将其“转换”为Access。相反,你必须从头重写它

您可以使用
DMax()
表达式返回“previous”
dname

SELECT
    dname,
    deptno AS this_row,
    DMax("dname", "dept", "dname < '" & [dname] & "'")
        AS previous_dname
FROM dept;
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;
然后将结果集左键联接回
dept
表,联接基于
previous\u dname=dname

SELECT
    dname,
    deptno AS this_row,
    DMax("dname", "dept", "dname < '" & [dname] & "'")
        AS previous_dname
FROM dept;
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;

非常感谢。。。但这种方法是否有可能获得在下面链接中被质疑的先前值?这个DMax函数语法在这里对文本数据做了什么
DMax()
表达式计算所有小于当前
dname
值的
dname
值,并返回其中的“最大值”。正如ASELECT 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;