T-SQL聚合函数max+子查询引发的灵异事件,求解释:)

dnawo 2013-06-20 10:24:28
select top 2 Id from Account

Id
-----------
1
2

(2 行受影响)

select top 2 Id from Account order by Id desc

Id
-----------
5
4

(2 行受影响)

select * from (select top 2 Id from Account) as tab

Id
-----------
1
2

(2 行受影响)

select max(Id) Id from (select top 2 Id from Account) as tab

Id
-----------
5

(1 行受影响)

第4句sql结果本应是2,但执行结果却是Account表最大Id的值5,SQL Server2000/2008上测试都是这个结果,谁给解释下。
...全文
228 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
百年树人 2013-06-21
  • 打赏
  • 举报
回复
子查询不指定排序规则,查询结果顺序是不确定的 试试以下这个
select max(Id) Id from (select top 2 Id from Account order by id) as tab
dnawo 2013-06-21
  • 打赏
  • 举报
回复
引用 2 楼 josy 的回复:
子查询不指定排序规则,查询结果顺序是不确定的 试试以下这个
select max(Id) Id from (select top 2 Id from Account order by id) as tab
原来是这样,感谢!
KevinLiu 2013-06-21
  • 打赏
  • 举报
回复
select max(Id) Id from (select top 2 Id from Account) as tab 这条语句中TOP的字查询没有排序,所以TOP 2的值是随机产生的不确定的,所以可能会出现你说的结果,也可能是其他结果。
专注or全面 2013-06-21
  • 打赏
  • 举报
回复
你整错了吧,我这个表上没有任何索引
fengxiaohan211 2013-06-21
  • 打赏
  • 举报
回复
TOP n TOP 关键字可指定返回结果集的前 n 行。如果指定了 ORDER BY,则将在对结果集排序之后选择行。n 是要返回的行数,除非指定了 PERCENT 关键字。PERCENT 将指定 n 为要返回的结果集中的行所占的百分比。例如,以下 SELECT 语句将从 SalesOrderHeader 表返回 10 个最新的销售订单。 SELECT TOP 10 SalesOrderID, OrderDate FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC 下面的语句从 PurchaseOrderDetail 表中删除了其到期日期早于 2002 年 7 月 1 日的 20 个随机行。 USE AdventureWorks; GO DELETE TOP (20) FROM Purchasing.PurchaseOrderDetail WHERE DueDate < '20020701'; 如果需要使用 TOP 来删除按有意义的时间顺序排列的行,您必须同时使用 TOP 和 ORDER BY 子句。下面的查询从 PurchaseOrderDetail 表中删除了其到期日期最早的 10 行。 USE AdventureWorks; GO DELETE FROM Purchasing.PurchaseOrderDetail WHERE PurchaseOrderDetailID IN (SELECT TOP 10 PurchaseOrderDetailID FROM Purchasing.PurchaseOrderDetail ORDER BY DueDate ASC); GO 如果需要使用 TOP 来应用按有意义的时间顺序排列的更新,您必须同时使用 TOP 和 ORDER BY 子句。下列示例更新了雇佣最早的 10 名雇员的假期小时数。 UPDATE HumanResources.Employee SET VacationHours = VacationHours + 8 FROM (SELECT TOP 10 EmployeeID FROM HumanResources.Employee ORDER BY HireDate ASC) AS th WHERE HumanResources.Employee.EmployeeID = th.EmployeeID; UPDATE TOP (10) Sales.Store SET SalesPersonID = 276 WHERE SalesPersonID = 275; 与 INSERT、UPDATE 或 DELETE 一起使用的 TOP 表达式中被引用行将不按任何顺序排列。TOP n 随机返回 n 行。例如,下面的 INSERT 语句包含 ORDER BY 子句,但该子句并不影响由 INSERT 语句直接引用的行。 INSERT TOP (2) INTO Table2 (ColumnB) SELECT ColumnA FROM Table1 ORDER BY ColumnA 前一个查询中的 ORDER BY 子句仅引用嵌套 SELECT 语句返回的行。INSERT 语句选择 SELECT 语句返回的任意两行。若要确保插入 SELECT 子查询返回的前两行,请按如下所示重写该查询。 INSERT INTO Table2 (ColumnB) SELECT TOP (2) ColumnA FROM Table1 ORDER BY ColumnA
dengixnyu 2013-06-20
  • 打赏
  • 举报
回复
坑人的吧 难道id不是int类型?有空格或者其他符号?

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧