2015-08-08 73 views
0

我有一個Access 2000 .mdb文件。我有這個查詢在同一個數據庫,但在SQL Server上。該查詢在SQL Server中正常工作,但在Access中出現錯誤;我認爲這是由於ROW_NUMBER()將查詢從SQL Server轉換爲Access 2000

我無法使用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 

不幸的是這個查詢返回奇怪的結果。更改開始索引(How do I implement pagination in SQL for MS Access?),有時會返回10個結果(頁面大小),有時會根據開始索引(startpos +頁面大小)返回12個結果。

我做錯了什麼或這個東西在沒有VBA的情況下無法訪問?

感謝

回答

1

請考慮以下情況。 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; 
0

首先,查詢在MS-Access是邏輯上的SQL Server的查詢完全不同。

第一個給你的第一排25行排序cognome,nome。 Access-Query以指定的順序爲您提供前20行中的最後10行。

在Access中沒有內置函數,如ROW_NUMBER。由於您使用兩個字段作爲ROW_NUMBER(cognome,nome)的排序條件,Count(*)子查詢的使用不起作用。

但是我已經在Access中建立了一種RANK-Function,也許這個工作適合你。但是,如果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函數。但是,在每次查詢之前重置計數器至關重要。

另一個選項使用Pass-Through-Query並將第一個查詢直接發送到SQL-Server。您必須在Access中的查詢對象中指定odbc-Connections字符串。

+1

好答案!只需在外部派生表中添加Rank,以便它可以在外部表的WHERE中使用。由於RowID是在最內層子查詢中計算的,因此您甚至可以刪除外部表「p」,因爲它不再需要。讓我們看看OP的想法。 – Parfait

+0

謝謝Parfait。我認爲需要使用單獨的ORDER BY的外部查詢,當有多於一行的cognome具有相同的值時。在這種情況下,等級值將是相同的,除非我指定明確的ORDER BY作爲最後一步,否則沒有特定的順序 – CPMunich