SQL Prompt如何避免使用旧式TOP子句

该TOP子句的语法坚持将括号或括起来的表达式作为其第一个参数,因此TOP 34严格来说应该是TOP (34),尽管如果您仅提供数字常量(例如)作为34参数,则任何一种样式都可以使用。的早期版本TOP只能使用一个恒定值,因此不需要括号,并且仍然支持旧的无括号样式,因此使用以前版本的SQL Server编写的代码仍然可以使用。

但是,TOP从那时起已经走了很长一段路,现在支持使用表达式,例如(@Rows*2)或子查询。在这种情况下,必须使用方括号。当他们还需要TOP在使用INSERT,UPDATE,MERGE,和DELETE语句,所以它是一种习惯值得采取无处不在。当SQL Prompt 发现使用旧式语法时,将引发其“违反代码风格”警告之一(ST006)。
SQLæç¤ºä»£ç åˆ†æžæ ·å¼è§„åˆ™ST006

最佳范例

想象一下,我们想要AdventureWorks表现最好的十大客户。
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:前十名并列领带

TOP 10 WITH TIES即使严格地我们应该使用,这种旧式语法也将非常愉快地运行(10)。
在这里插入图片描述

但是,如果您使用的是常数标量子查询,则在此示例中,所有客户中排名前0.1%的客户都需要加括号。
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,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 10 ROWS ONLY;

清单3:使用OFFESET和FETCH NEXT

你不能做的联系,但你可以指定一个变量,参数,甚至中常子查询作为参数传递给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与子查询一起使用

结论

SQL中有更严重的缺点,就是在TOP语句的参数中省略了方括号。奇怪的是,我一直对离开它们感到有点不自在,因为让我们想起当今TOP子句的功能非常有用。与过去不得不暂时将ROWCOUNT设置为要返回的行数相距很远!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值