在SQL Server中有没有关键字或元信息可以告诉你TOP是否生效?
EX:
Select TOP 5 * From Stuff
RESULT: 5 rows
什么是确定是否存在6个或更多的最佳方法?
I could do:
SELECT TOP 6 count(*) FROM Stuff
但我对另外一个获取计数的调用有所担忧,因为实际查询比这个复杂得多,并且在大型表上运行。
谢谢!
在SQL Server中有没有关键字或元信息可以告诉你TOP是否生效?
EX:
Select TOP 5 * From Stuff
RESULT: 5 rows
I could do:
SELECT TOP 6 count(*) FROM Stuff
但我对另外一个获取计数的调用有所担忧,因为实际查询比这个复杂得多,并且在大型表上运行。
谢谢!
没有可以自动使用的东西。你可以使用类似以下内容的东西:
DECLARE @N INT = 5;
WITH T
AS (SELECT TOP (@N + 1) *
FROM master..spt_values
ORDER BY number)
SELECT TOP (@N) *,
CASE
WHEN Count(*) OVER () = (@N + 1) THEN 1
ELSE 0
END AS MoreRecords
FROM T
ORDER BY number
WITH
只选择了6行。 - ean5533WITH
可能不行。我可能会使用一个变量来演示这一点。 - Aaron BertrandTOP 6
(或 TOP N+1
),这样它就可以在扫描到第六行后停止扫描。 - Martin Smith好的,你可以在客户端代码中选择前N+1个元素(在你的例子中N为5,所以在你的例子中选择前6个元素),并且丢弃最后一个元素,使用第六个元素的存在来确定如果一开始使用N是否会产生影响。然而,我不确定这样做有多少价值。
您可以在查询中添加一个布尔值,当具有相同逻辑的子查询的 COUNT(*) 返回大于5的值时,返回 true,当它返回5或更小的值时返回 false。
这将向返回的数据中添加您需要的信息。如果您担心性能,并且查询非常复杂,则与单独查询相比可能不会有很大的改善,但至少应该能提供一些小的改进。
如果不进行两个查询或者执行性能损耗重计算,那么没有办法实现这一点...
Select TOP 5 * From Stuff
并且
Select Count(*) From Stuff
SELECT TOP 5 Field1, field2, recordcount
FROM Stuff
CROSS JOIN (SELECT COUNT(*) as recordcount FROM Stuff) a
ORDER BY Field1
select top 5 *,
case when count(*) OVER() <= 5 then 'yes' else 'no' end as AllRecordsReturned
from supportContacts
ORDER BY
的TOP
是毫无意义的 - 你会得到按照什么顺序排列的TOP
行?! - marc_sORDER BY
不会影响他所问的内容。 - ean5533