将查询从 SQL 服务器翻译到 Access 2000
Translate query from SQL Server to Access 2000
我有一个 Access 2000 .mdb
文件。我在同一数据库中有此查询,但在 SQL 服务器上。该查询在 SQL Server 中运行良好,但在 Access 中出现错误;我认为这是由于 ROW_NUMBER()
.
我无法使用 vba 进行此查询,因为我必须 运行 使用 Odbc 驱动程序。
SELECT *
FROM
(SELECT
*,
ROW_NUMBER() OVER (ORDER BY cognome,nome ASC) AS RowID
FROM
(SELECT DISTINCT
(a.ID_PAZIENTE) AS codice,
a.NOME AS nome,
a.COGNOME AS cognome,
a.TITOLO AS titolo,
a.TELEFONOABITAZIONE AS tel,
a.TELEFONOUFFICIO AS uff,
a.FAX AS cell,
a.E_MAIL AS email,
a.SESSO AS sesso
FROM
PAZIENTI AS a
WHERE 1 = 1) AS AnagraficheDistinct
) AS Anagrafiche
WHERE
RowID >= 1 AND RowID <= 25
ORDER BY
cognome, nome ASC;
这是错误:
Syntax error (missing operator) in expression of query: "ROW_NUMBER()
OVER (ORDER BY cognome,nome ASC)
我尝试根据在线文档转换查询,这就是我所做的:
SELECT *
FROM (
SELECT Top 10
*
FROM
(
SELECT DISTINCT TOP 20 p.ID_PAZIENTE,p.cognome,p.nome
FROM PAZIENTI p
ORDER BY p.cognome ASC,p.nome ASC
) AS sub1
ORDER BY sub1.cognome DESC,sub1.nome DESC
) AS anagrafiche
ORDER BY p.cognome ASC,p.nome ASC
不幸的是,此查询 return 的结果很奇怪。更改起始索引 (How do I implement pagination in SQL for MS Access?),有时 return 10 个结果(页面大小),有时 12 个基于起始索引(startpos + 页面大小)。
我做错了什么,或者如果没有 VBA,Access 就不可能做这件事?
谢谢
首先,MS-Access 中的Query 在逻辑上与SQL-Server-Query 完全不同。
第一个为您提供按 cognome,nome
排序的前 25 行。
Access-Query 按指定顺序为您提供前 20 行中的最后 10 行。
Access 中没有 ROW_NUMBER 这样的内置函数。并且因为您使用两个字段作为 ROW_NUMBER (cognome, nome) 的排序标准,所以 Count(*) 子查询的使用不起作用。
但我在 Access 中构建了一种 RANK 函数,也许它适合你。但是,如果 cognome
中具有相同值的行数大于页面大小,它也可能会返回更多行,如您为一个页面大小指定的那样。在此查询中,重要的是只有 cognome
是 Count(*) 子查询的一部分。
SELECT p.*
FROM
(
SELECT codice, cognome, nome, titolo, tel, uff, cell, email
FROM
(
SELECT DISTINCT a.ID_PAZIENTE AS codice, a.COGNOME AS cognome,
a.NOME AS nome, a.TITOLO AS titolo,
a.TELEFONOABITAZIONE AS tel, a.TELEFONOUFFICIO AS uff,
a.FAX AS cell, a.E_MAIL AS email, a.SESSO AS sesso,
(SELECT Count(*) FROM PAZIENTI AS temp
WHERE temp.cognome < a.cognome
) + 1 AS Rank
FROM PAZIENTI AS a
) AS psub
WHERE Rank >= 1 AND Rank <= 5
ORDER BY Rank
) p
ORDER BY cognome, nome
如果这对您没有帮助,我想,您将需要一个 VBA-Function。但是这里在每次查询之前重置计数器是至关重要的。
另一个选项是使用传递查询并将第一个查询直接发送到 SQL-服务器。您必须在 Access 的查询对象中指定 odbc-Connectionstring。
考虑以下问题。 RowNumber() 在 Access SQL 中不可用,但可以使用子查询按名称排序复制:
SELECT *
FROM
(SELECT DISTINCT
a.ID_PAZIENTE AS codice,
a.NOME AS nome,
a.COGNOME AS cognome,
a.TITOLO AS titolo,
a.TELEFONOABITAZIONE AS tel,
a.TELEFONOUFFICIO AS uff,
a.FAX AS cell,
a.E_MAIL AS email,
a.SESSO AS sesso,
(SELECT count(*)
FROM PAZIENTI As b
WHERE b.cognome <= a.cognome
AND b.nome <= a.nome) As RowID
FROM PAZIENTI AS a) AS AnagraficheDistinct
) AS Anagrafiche
WHERE RowID >= 1 AND RowID <= 25
ORDER BY cognome, nome;
我有一个 Access 2000 .mdb
文件。我在同一数据库中有此查询,但在 SQL 服务器上。该查询在 SQL Server 中运行良好,但在 Access 中出现错误;我认为这是由于 ROW_NUMBER()
.
我无法使用 vba 进行此查询,因为我必须 运行 使用 Odbc 驱动程序。
SELECT *
FROM
(SELECT
*,
ROW_NUMBER() OVER (ORDER BY cognome,nome ASC) AS RowID
FROM
(SELECT DISTINCT
(a.ID_PAZIENTE) AS codice,
a.NOME AS nome,
a.COGNOME AS cognome,
a.TITOLO AS titolo,
a.TELEFONOABITAZIONE AS tel,
a.TELEFONOUFFICIO AS uff,
a.FAX AS cell,
a.E_MAIL AS email,
a.SESSO AS sesso
FROM
PAZIENTI AS a
WHERE 1 = 1) AS AnagraficheDistinct
) AS Anagrafiche
WHERE
RowID >= 1 AND RowID <= 25
ORDER BY
cognome, nome ASC;
这是错误:
Syntax error (missing operator) in expression of query: "ROW_NUMBER() OVER (ORDER BY cognome,nome ASC)
我尝试根据在线文档转换查询,这就是我所做的:
SELECT *
FROM (
SELECT Top 10
*
FROM
(
SELECT DISTINCT TOP 20 p.ID_PAZIENTE,p.cognome,p.nome
FROM PAZIENTI p
ORDER BY p.cognome ASC,p.nome ASC
) AS sub1
ORDER BY sub1.cognome DESC,sub1.nome DESC
) AS anagrafiche
ORDER BY p.cognome ASC,p.nome ASC
不幸的是,此查询 return 的结果很奇怪。更改起始索引 (How do I implement pagination in SQL for MS Access?),有时 return 10 个结果(页面大小),有时 12 个基于起始索引(startpos + 页面大小)。
我做错了什么,或者如果没有 VBA,Access 就不可能做这件事?
谢谢
首先,MS-Access 中的Query 在逻辑上与SQL-Server-Query 完全不同。
第一个为您提供按 cognome,nome
排序的前 25 行。
Access-Query 按指定顺序为您提供前 20 行中的最后 10 行。
Access 中没有 ROW_NUMBER 这样的内置函数。并且因为您使用两个字段作为 ROW_NUMBER (cognome, nome) 的排序标准,所以 Count(*) 子查询的使用不起作用。
但我在 Access 中构建了一种 RANK 函数,也许它适合你。但是,如果 cognome
中具有相同值的行数大于页面大小,它也可能会返回更多行,如您为一个页面大小指定的那样。在此查询中,重要的是只有 cognome
是 Count(*) 子查询的一部分。
SELECT p.*
FROM
(
SELECT codice, cognome, nome, titolo, tel, uff, cell, email
FROM
(
SELECT DISTINCT a.ID_PAZIENTE AS codice, a.COGNOME AS cognome,
a.NOME AS nome, a.TITOLO AS titolo,
a.TELEFONOABITAZIONE AS tel, a.TELEFONOUFFICIO AS uff,
a.FAX AS cell, a.E_MAIL AS email, a.SESSO AS sesso,
(SELECT Count(*) FROM PAZIENTI AS temp
WHERE temp.cognome < a.cognome
) + 1 AS Rank
FROM PAZIENTI AS a
) AS psub
WHERE Rank >= 1 AND Rank <= 5
ORDER BY Rank
) p
ORDER BY cognome, nome
如果这对您没有帮助,我想,您将需要一个 VBA-Function。但是这里在每次查询之前重置计数器是至关重要的。
另一个选项是使用传递查询并将第一个查询直接发送到 SQL-服务器。您必须在 Access 的查询对象中指定 odbc-Connectionstring。
考虑以下问题。 RowNumber() 在 Access SQL 中不可用,但可以使用子查询按名称排序复制:
SELECT *
FROM
(SELECT DISTINCT
a.ID_PAZIENTE AS codice,
a.NOME AS nome,
a.COGNOME AS cognome,
a.TITOLO AS titolo,
a.TELEFONOABITAZIONE AS tel,
a.TELEFONOUFFICIO AS uff,
a.FAX AS cell,
a.E_MAIL AS email,
a.SESSO AS sesso,
(SELECT count(*)
FROM PAZIENTI As b
WHERE b.cognome <= a.cognome
AND b.nome <= a.nome) As RowID
FROM PAZIENTI AS a) AS AnagraficheDistinct
) AS Anagrafiche
WHERE RowID >= 1 AND RowID <= 25
ORDER BY cognome, nome;