翻譯|使用教程|編輯:楊鵬連|2020-07-15 10:32:58.760|閱讀 342 次
概述:如果要在表達式或子查詢中或在INSERT,UPDATE,MERGE和DELETE語句中使用TOP,則需要使用方括號,因此在任何地方都采用它是一個好習(xí)慣。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
SQL Prompt是一款實用的SQL語法提示工具。SQL Prompt根據(jù)數(shù)據(jù)庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設(shè)置使代碼簡單易讀--當(dāng)開發(fā)者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據(jù)需要進行自定義,使之以預(yù)想的方式工作。
該TOP子句的語法堅持將括號或括起來的表達式作為其第一個參數(shù),因此TOP 34嚴(yán)格來說應(yīng)該是TOP (34),盡管如果您僅提供數(shù)字常量(例如)作為34參數(shù),則任何一種樣式都可以使用。的早期版本TOP只能使用一個恒定值,因此不需要括號,并且仍然支持舊的無括號樣式,因此使用SQL Server 早期版本編寫的代碼仍然可以使用。
但是,TOP從那時起已經(jīng)走了很長一段路,現(xiàn)在支持使用表達式,例如(@Rows*2)或子查詢。在這種情況下,必須使用方括號。當(dāng)他們還需要TOP在使用INSERT,UPDATE,MERGE,和DELETE語句,所以它是一種習(xí)慣值得采取無處不在。當(dāng)SQL Prompt 發(fā)現(xiàn)使用舊式語法時,將引發(fā)其“違反代碼風(fēng)格”警告之一(ST006)。
TOP例子
想象一下,我們希望獲得AdventureWorks表現(xiàn)最佳的前十名客戶。
SELECT TOP 10 WITH TIES Sum(Ord.SubTotal) AS spend,
Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' '
+ Coalesce(Per.MiddleName + ' ', '') + Per.LastName
+ Coalesce(Per.Suffix, '')
)
FROM Sales.SalesOrderHeader AS Ord
INNER JOIN Sales.Customer AS Cust
ON Ord.CustomerID = Cust.CustomerID
INNER JOIN Person.Person AS Per
ON Cust.PersonID = Per.BusinessEntityID
GROUP BY Ord.CustomerID
ORDER BY spend DESC;
清單1:前十名并列領(lǐng)帶
TOP 10 WITH TIES即使嚴(yán)格地我們應(yīng)該使用,這種舊式語法也將很愉快地運行(10)。
SELECT TOP (SELECT Count(*)/1000 FROM Sales.Customer) Sum(Ord.SubTotal) AS spend, Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' ' + Coalesce(Per.MiddleName + ' ', '') + Per.LastName + Coalesce(Per.Suffix, '') ) FROM Sales.SalesOrderHeader AS Ord INNER JOIN Sales.Customer AS Cust ON Ord.CustomerID = Cust.CustomerID INNER JOIN Person.Person AS Per ON Cust.PersonID = Per.BusinessEntityID GROUP BY Ord.CustomerID ORDER BY spend DESC
清單2:TOP 0.1%的客戶
使用OFFSET和FETCH NEXT作為替代
如果您不喜歡在做括號時感到煩惱,則可以高高興興地使用它OFFSET,F(xiàn)ETCH NEXT而不是不需要括號,盡管花了很多時間。
SELECT Sum(Ord.SubTotal) AS spend,
Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' '
+ Coalesce(Per.MiddleName + ' ', '') + Per.LastName
+ Coalesce(Per.Suffix, '')
)
FROM Sales.SalesOrderHeader AS Ord
INNER JOIN Sales.Customer AS Cust
ON Ord.CustomerID = Cust.CustomerID
INNER JOIN Person.Person AS Per
ON Cust.PersonID = Per.BusinessEntityID
GROUP BY Ord.CustomerID
ORDER BY spend DESC
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
清單3:使用OFFESET和FETCH NEXT
你不能做的聯(lián)系,但你可以指定一個變量,參數(shù),甚至中常子查詢作為參數(shù)傳遞給OFFSET和FETCH NEXT,除非你使用子查詢你不需要支架。
SELECT Sum(Ord.SubTotal) AS spend,
Max(Coalesce(Per.Title + ' ', '') + Per.FirstName + ' '
+ Coalesce(Per.MiddleName + ' ', '') + Per.LastName
+ Coalesce(Per.Suffix, '')
)
FROM Sales.SalesOrderHeader AS Ord
INNER JOIN Sales.Customer AS Cust
ON Ord.CustomerID = Cust.CustomerID
INNER JOIN Person.Person AS Per
ON Cust.PersonID = Per.BusinessEntityID
GROUP BY Ord.CustomerID
ORDER BY spend DESC
OFFSET 0 ROWS
FETCH NEXT (SELECT Count(*)/1000 FROM Sales.Customer) ROWS ONLY;
清單4:將FETCH NEXT與子查詢一起使用
結(jié)論
SQL中有更嚴(yán)重的缺點,就是在TOP語句的參數(shù)中省略了方括號。奇怪的是,我一直對離開它們感到有點不自在,因為讓我們想起當(dāng)今TOP子句的功能非常有用。與過去不得不暫時將ROWCOUNT設(shè)置為要返回的行數(shù)相距很遠!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: