2012-10-30 66 views
1

我試圖用這個查詢得到我的表的最後和下一行:SQL語句返回錯誤的值(TOP N ... ORDER BY)

SELECT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC 
UNION 
SELECT TOP 2 Nummer FROM Empfänger WHERE Nummer >= 4748 ORDER BY Nummer ASC; 

主鍵「Nummer」是獨一無二的和自增,所以

4747, 4748, 4749 

應該恕我直言,返回上述的數字,而是返回:

4747, 4798, 4799 

當我使用Access打開數據庫並將篩選器設置爲「之間」時,值顯示正確。

我改變了語句:

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC 
UNION 
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4748 
UNION 
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4748 ORDER BY Nummer ASC; 

這工作近乎完美。

4747, 4748, 4750 

當我寫每一個語句返回正確的價值觀單個查詢...

SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer < 4748 ORDER BY Nummer DESC 
= 4747 
SELECT DISTINCT Nummer FROM Empfänger WHERE Nummer = 4748 
= 4748 
SELECT DISTINCT TOP 1 Nummer FROM Empfänger WHERE Nummer > 4748 ORDER BY Nummer ASC; 
= 4749 

\

​​

我檢查一遍,突然上面所示的查詢工作。 謝謝你的幫助。

+2

您正在使用哪些DBMS?在您的數據庫管理系統中'order by'之前是否應用了'TOP n'子句?檢查文檔! –

+0

我使用Access 2007,但數據庫最初是在Access 1997中編寫的。 Order by子句應用於TOP子句之後,我相信。 – jAC

回答

4

訪問使用JET引擎。它seems是ORDER BY應用 TOP子句,你將需要使用的形式

select top n ... 
from (
    select ... 
    from table 
    where ... 
    order by ... 
) 

的子查詢,以得到它的工作。

+0

非常感謝! – jAC

0

是的,Access在此領域不符合ANSI-92標準,而SQL-Server可以使SQL-Server模仿Access的不符合規範行爲作爲選項。我發現這種情況下,我可以選擇將ID字段(即PK)添加到ORDER BY中,從而解決問題。只要您的解決方案導致多字段ORDER BY中的至少一個字段的值在連續記錄中不同,那麼您的解決方法將遵循TOP參數。如果你的密鑰在至少一個字段上沒有中斷,那麼你可以想到在這個令人驚訝的業餘方式中執行SELECT TOP:

「返回TOP n記錄並查看第n條記錄的ORDER BY字段的值(s)幷包括具有該(那些)價值的所有額外記錄「。