我有一个带有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
答案 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