• <menu id="w2i4a"></menu>
  • logo SQL Prompt教程

    文檔首頁(yè)>>SQL Prompt教程>>SQL Prompt使用教程:避免使用舊式TOP子句(ST006)

    SQL Prompt使用教程:避免使用舊式TOP子句(ST006)


    SQL Prompt是一款實(shí)用的SQL語(yǔ)法提示工具。SQL Prompt根據(jù)數(shù)據(jù)庫(kù)的對(duì)象名稱、語(yǔ)法和代碼片段自動(dòng)進(jìn)行檢索,為用戶提供合適的代碼選擇。自動(dòng)腳本設(shè)置使代碼簡(jiǎn)單易讀--當(dāng)開(kāi)發(fā)者不大熟悉腳本時(shí)尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據(jù)需要進(jìn)行自定義,使之以預(yù)想的方式工作。

    點(diǎn)擊下載SQL Prompt正式版

    該TOP子句的語(yǔ)法堅(jiān)持將括號(hào)或括起來(lái)的表達(dá)式作為其第一個(gè)參數(shù),因此TOP 34嚴(yán)格來(lái)說(shuō)應(yīng)該是TOP (34),盡管如果您僅提供數(shù)字常量(例如)作為34參數(shù),則任何一種樣式都可以使用。的早期版本TOP只能使用一個(gè)恒定值,因此不需要括號(hào),并且仍然支持舊的無(wú)括號(hào)樣式,因此使用SQL Server 早期版本編寫(xiě)的代碼仍然可以使用。

    但是,TOP從那時(shí)起已經(jīng)走了很長(zhǎng)一段路,現(xiàn)在支持使用表達(dá)式,例如(@Rows*2)或子查詢。在這種情況下,必須使用方括號(hào)。當(dāng)他們還需要TOP在使用INSERT,UPDATE,MERGE,和DELETE語(yǔ)句,所以它是一種習(xí)慣值得采取無(wú)處不在。當(dāng)SQL Prompt 發(fā)現(xiàn)使用舊式語(yǔ)法時(shí),將引發(fā)其“違反代碼風(fēng)格”警告之一(ST006)。

    SQL Prompt使用教程:避免使用舊式TOP子句(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)該使用,這種舊式語(yǔ)法也將很愉快地運(yùn)行(10)。

    SQL Prompt使用教程:避免使用舊式TOP子句(ST006)
    但是,如果您使用的是常數(shù)標(biāo)量子查詢,則在此示例中,所有客戶中排名前0.1%的客戶都需要加括號(hào)。

    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作為替代

    如果您不喜歡在做括號(hào)時(shí)感到煩惱,則可以高高興興地使用它OFFSET,F(xiàn)ETCH NEXT而不是不需要括號(hào),盡管花了很多時(shí)間。

    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)系,但你可以指定一個(gè)變量,參數(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)重的缺點(diǎn),就是在TOP語(yǔ)句的參數(shù)中省略了方括號(hào)。奇怪的是,我一直對(duì)離開(kāi)它們感到有點(diǎn)不自在,因?yàn)樽屛覀兿肫甬?dāng)今TOP子句的功能非常有用。與過(guò)去不得不暫時(shí)將ROWCOUNT設(shè)置為要返回的行數(shù)相距很遠(yuǎn)!

    試用下載>>>

    SQL Prompt 使用教程>>>


    想要購(gòu)買SQL Prompt正版授權(quán),或了解更多產(chǎn)品信息請(qǐng)點(diǎn)擊【咨詢?cè)诰€客服】

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();