翻譯|使用教程|編輯:楊鵬連|2020-08-13 13:55:04.117|閱讀 284 次
概述:如果要在表達式或子查詢中或在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ī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)。
想象一下,我們想要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ī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中有更嚴重的缺點,就是在TOP語句的參數(shù)中省略了方括號。奇怪的是,我一直對離開它們感到有點不自在,因為讓我們想起當(dāng)今TOP子句的功能非常有用。與過去不得不暫時將ROWCOUNT設(shè)置為要返回的行數(shù)相距很遠!
試用下載>>>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: