SQL:使用ORDER BY子句的SELECT TOP不会返回正确的结果

时间:2014-06-26 08:35:00

标签: sql sql-server

我有一个带有ORDER BY子句的SELECT TOP查询,但没有返回正确的结果。下面是一个示例查询及其输出。

任何建议/解决方法/解决方案?

查询:

CREATE TABLE #TestTop
(
    TopID INT,
    TopStr VARCHAR(MAX)
)

INSERT INTO #TestTop VALUES(1749, '');
INSERT INTO #TestTop VALUES(1750, '');
INSERT INTO #TestTop VALUES(1752, 'z');
INSERT INTO #TestTop VALUES(1739, 'a');

SELECT * FROM #TestTop ORDER BY TopStr ASC

SELECT TOP 1 * FROM #TestTop ORDER BY TopStr ASC

SELECT TOP 4 * FROM #TestTop ORDER BY TopStr ASC

DROP TABLE #TestTop;

结果:

[SELECT *]

TopID       TopStr
----------- -----------
1749        
1750        
1739        a
1752        z       

[SELECT TOP 1]

TopID       TopStr
----------- --------------
1750        

[SELECT TOP 4]

TopID       TopStr
----------- --------------
1750        
1749        
1739        a
1752        z        

3 个答案:

答案 0 :(得分:8)

您尚未指定完整的排序,因此数据库(无论哪一个)都有权按其所需的任何顺序返回与TopStr匹配的行。只是因为你的第一个查询恰好给你想要的顺序是运气,而这可能会根据系统上的数据库升级/负载/许多其他因素而改变。

如果您希望该列以及TopStr对结果进行排序,则需要将TopId添加到排序列表中。

答案 1 :(得分:0)

这里的问题是用于排序的列:原始语句使用TopStr列,并且由于它的所有值都相等,因此未指定返回行的顺序。要更正您的陈述,只需使用正确的列TopID,如下所示:

CREATE TABLE #TestTop
(
    TopID INT,
    TopStr VARCHAR(50)
)

INSERT INTO #TestTop VALUES(1749, '');
INSERT INTO #TestTop VALUES(1750, '');
INSERT INTO #TestTop VALUES(1752, '');
INSERT INTO #TestTop VALUES(1739, '');

SELECT '' [_ALL_],* FROM #TestTop ORDER BY TopID ASC
SELECT TOP 1 '' [TOP_1], * FROM #TestTop ORDER BY TopID ASC
SELECT TOP 4 '' [TOP_4], * FROM #TestTop ORDER BY TopID ASC

DROP TABLE #TestTop;

答案 2 :(得分:-4)

试试这个,它适用于sql server

SELECT TOP 4 * FROM #TestTop 
order by ROW_NUMBER() OVER(ORDER BY (CASE WHEN TopStr = '' THEN NULL ELSE TopStr END))

OR

SET ROWCOUNT 4
SELECT * FROM #TestTop ORDER BY TopStr ASC
SET ROWCOUNT 0