問題解決:除非另外還指定了 TOP 或 FOR XML,否則,ORDER BY 子句在視圖、內聯函數、派生表、子查詢和公用表表達式中無效

問題場景

因爲項目需要,需要在公共框架裏面引入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關鍵字有兩種方法使用:

  1. 指定具體數目
    我們可以用具體的數字裏進行限量獲取,這個和mysqllimit關鍵字有點像。這裏用一個sql來展示從表中獲取第20個之後的10個數據:

    SELECT  TOP  10 * 
    FROM  test2
    WHERE  id NOT IN( SELECT top  20 id FROM  test2 )
    
  2. 指定具體百分比
    如果我們的sql需要獲取全部數據來做過濾,又不知道具體的數目,這個時候就可以用百分比來進行獲取,其表達形式爲TOP N percentN爲百分比數目,百分比值必須介於 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關鍵字的使用。
在這裏插入圖片描述

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以點擊關注
可以掃描以下二維碼,關注我的公衆號:楓夜之求索閣,查看我最新的分享!
在這裏插入圖片描述
拜拜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章