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                          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/

相关文章:

c# - 查询不返回任何东西

json - 将 JSON 提要自动解析到 MS Access 中

sql - MS Access SQL,更改数据类型

vba - 关闭时 Access 崩溃

html - 将 MS Access 表单嵌入在线网站

mysql - SQL 查询 - 在日期和时间之间查找

sql - 如何在第二个查询中使用第一个查询的结果?

vba - 限制用户对 MS Access 中的表和查询的 Access

php - 使用 PHP 从 Linux 服务器连接到远程 MS Access 数据库

ms-access - 在 Access 窗体上将控件分组在一起