我有两张桌子
[LocatioNo],[LocationName],[Description]
)[LocationNo],[LocationCode],[DDate],[BillNo],[Model],[Quantity],[SNo]
)
(来源:staticflickr.com)
](http://www.flickr.com/photos/77377790@N08/6782618850 “点击查看Flickr”)
以及涉及在 SQL Server 2000 中创建的 2 个表的视图
CREATE VIEW [dbo].[QueryLocation]
AS
SELECT TOP (100) PERCENT
dbo.LocationData.LocationNo, dbo.LocationData.LocationCode,
dbo.LocationData.DDate, dbo.LocationData.BillNo,
dbo.LocationData.Model,
SUM(dbo.LocationData.Quantity) AS Quantity,
dbo.LocationMaster.LocationName
FROM
dbo.LocationData
INNER JOIN
dbo.LocationMaster ON dbo.LocationData.LocationNo = dbo.LocationMaster.LocatioNo
GROUP BY
dbo.LocationMaster.LocationName, dbo.LocationData.LocationNo,
dbo.LocationData.LocationCode, dbo.LocationData.DDate, dbo.LocationData.BillNo,
dbo.LocationData.Model ORDER BY dbo.LocationData.BillNo
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 2000 中执行以下查询时,网格中的结果按billno
列排序。
SELECT * FROM QueryLocation
Run Code Online (Sandbox Code Playgroud)
(来源:staticflickr.com)
](http://www.flickr.com/photos/77377790@N08/6782618858 “点击查看 Flickr”)
升级到 SQL Server …
为了更好地理解 SQL Server 查询处理器,我一直在思考ORDER BY
子句是如何工作的,以及 SQL Server 如何提供结果。
对于任何给定的数据集,SQL Server 似乎将以完全相同的顺序提供结果,这些数据集保持不变并且永远不会改变。一旦您引入任何类型的不确定性,例如开发人员更改某些内容,就不能再期望结果的顺序是相同的。
简单地以相同的顺序查看结果,每次按下F5
并不能保证您期望的结果。
尝试这个:
USE TempDB;
DROP TABLE TestOrderBy;
DROP TABLE TestOrderBy2;
CREATE TABLE TestOrderBy
(
ID INT NOT NULL CONSTRAINT PK_TestOrderBy PRIMARY KEY CLUSTERED IDENTITY(1,1)
, SomeData varchar(255)
);
INSERT INTO TestOrderBy (SomeData) VALUES ('E');
INSERT INTO TestOrderBy (SomeData) VALUES ('D');
INSERT INTO TestOrderBy (SomeData) VALUES ('C');
INSERT INTO TestOrderBy (SomeData) VALUES ('B');
INSERT INTO TestOrderBy (SomeData) VALUES ('A');
CREATE TABLE TestOrderBy2
(
ID INT NOT …
Run Code Online (Sandbox Code Playgroud) select *
from [table_a];
Run Code Online (Sandbox Code Playgroud)
聚集索引根据您选择的列对表进行排序。
话虽这么说,如果我有一个聚集索引[column_a], [column_b],
并[column_c]
从上面运行相同的查询,那么数据是否总是根据该顺序返回排序,因为这是创建聚集索引的顺序?
更多说明:
如果我ORDER BY
在索引中没有的内容上添加一个子句,执行计划将有一个排序运算符。
如果我对ORDER BY
聚集索引中使用的所有列都有一个子句,则执行计划将不会有排序运算符。
这就是我首先问这个问题的原因。