問題場景
因爲項目需要,需要在公共框架裏面引入sqlserver
方言類。而在實現sqlserver
方言類之後,調用方言類的方法的時候,發現一個錯誤
錯誤提示如下:
>[錯誤] 腳本行:1-10 --------------------------------------
Id 1033, Level 15, State 1, Line 10
除非另外還指定了 TOP 或 FOR XML,否則,ORDER BY 子句在視圖、內聯函數、派生表、子查詢和公用表表達式中無效。
消息: 1033, 級別: 15, 狀態: 1, 過程: , 行: 10
運行的SQL
如下:
SELECT COUNT(*)
FROM (
SELECT wf.S_VER AS "S_VER"
FROM ( SELECT DISTINCT(S_VER)
FROM test
WHERE 1=1 AND I_COMMON = 1
) AS wf
ORDER BY
wf.S_VER ASC
) a
問題環境
軟件 | 版本 |
---|---|
SqlServer | 2008 |
問題原因
從問題的提示,我們可以看出,我們執行的SQL
內部含有order by
關鍵字,而且是在子查詢等情況使用了該關鍵字,導致了數據庫引擎認爲該SQL
有問題,所以報錯了。
解決方案
這個時候,我們可以使用top
關鍵字來規避這個問題。而top
關鍵字有兩種方法使用:
-
指定具體數目
我們可以用具體的數字裏進行限量獲取,這個和mysql
的limit
關鍵字有點像。這裏用一個sql
來展示從表中獲取第20個之後的10個數據:SELECT TOP 10 * FROM test2 WHERE id NOT IN( SELECT top 20 id FROM test2 )
-
指定具體百分比
如果我們的sql
需要獲取全部數據來做過濾,又不知道具體的數目,這個時候就可以用百分比來進行獲取,其表達形式爲TOP N percent
,N
爲百分比數目,百分比值必須介於 0 到 100 之間,不然會報錯。像我們文章開頭說的問題SQL
,就需要使用這個,經過修正之後,SQL
如下:SELECT COUNT(*) FROM ( SELECT top 100 percent wf.S_VER AS "S_VER" FROM ( SELECT DISTINCT(S_VER) FROM DWF_DE_WF WHERE 1=1 AND I_COMMON = 1 ) AS wf ORDER BY wf.S_VER ASC ) a
結果
經過修正之後,sql
執行結果如下:
>[SQL] 腳本行:1-10 -------------------------------------
SELECT COUNT(*)
FROM (
SELECT top 100 percent wf.S_VER AS "S_VER"
FROM ( SELECT DISTINCT(S_VER)
FROM DWF_DE_WF
WHERE 1=1 AND I_COMMON = 1
) AS wf
ORDER BY
wf.S_VER ASC
) a
column1
----------
14
已選定 1 條記錄 [抓取元數據:0ms] [抓取數據:0ms]
[已執行:2020-6-9 下午1:35:03] [執行:4ms]
總結
這個是sqlserver
的小知識點,主要是通過這個問題,引出對top
關鍵字的使用。
隨緣求贊
如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以點擊關注
可以掃描以下二維碼,關注我的公衆號:楓夜之求索閣,查看我最新的分享!