我可以从 sql server 中的一个 sql 查询中获取 count() 和行吗?
我想获取结果总数和某些查询的前 n 行 - 是否可能 在一份声明中?
我期望的结果是:
count(..) column1 column2
125 some_value some_value
125 some_value some_value
提前谢谢您!
I'd like to get the total count of results and top n rows of some query - is it possible
in one statement?
I'd expect the results as:
count(..) column1 column2
125 some_value some_value
125 some_value some_value
Thank you in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
像这样:
编辑:在投反对票和计数/结束答案后。对我的 2 个表进行比较,
您可以看到我的 CROSS JOIN/简单聚合和 COUNT/空 ORDER BY 子句之间存在巨大差异,
我在一个包含 570k 行的表上重复了这一点,这是 IO
Like this:
Edit: After downvote and COUNT/OVER answer. A comparison on 2 tables of mine
You can see a huge difference between my CROSS JOIN/simple aggregate and a COUNT/empty ORDER BY clause
I've repeated this on a table with 570k rows and here is the IO
怎么样
关于
CROSS JOIN
查询在复杂的
INSERT
/DELETE
环境中,交叉联接将返回不正确的行计数。从多个连接尝试此操作
连接 1
连接 2
每次记录数 (
@@ROWCOUNT
) 与T2.cnt
不同在
COUNT(*) OVER() 的情况下
,只有一个表扫描,并且@@ROWCOUNT
始终与T2.cnt
相同关于查询计划 - SQL 2005 SP3 似乎很多在执行
COUNT(*) OVER()
方面比 SQL 2008 R2 弱。最重要的是,它错误地报告了查询成本(我从未想过子查询的成本可能超过整个查询的 100%)。在很多情况下,
COUNT(*) OVER()
的成本在CROSS JOIN
的 50-75% 之间。交叉连接的最佳情况是如果有一个非常狭窄的索引来进行计数。这样就会对数据进行聚集索引扫描+对计数进行索引扫描。
与往常一样,最好是衡量、衡量、衡量并做出您愿意接受的妥协。
what about
Regarding
CROSS JOIN
queriesIn a heavy
INSERT
/DELETE
environment, the cross join will return incorrect row count.Try this from multiple connections
connection 1
connection 2
Each time, the count of records (
@@ROWCOUNT
) is different toT2.cnt
In the case of
COUNT(*) OVER()
, there is only a single table scan and the@@ROWCOUNT
is always the same asT2.cnt
Regarding query plans - SQL 2005 SP3 appears to be much weaker at doing
COUNT(*) OVER()
than SQL 2008 R2. On top of that, it incorrectly reports query costs (I never thought a sub query could cost more than 100% of the entire query).In a lot of scenarios, the cost of the
COUNT(*) OVER()
is between 50-75% of theCROSS JOIN
The best case scenario for a cross join would be if there was a very narrow index to do the count on. That way there will be a clustered index scan for the data + an index scan for the count.
As always, it's best to measure, measure, measure and go with the compromise that you're happy to live with.
您可以使用
CROSS JOIN
和CTE来做到这一点,但它不是很有效:我认为获得您想要的结果的更好方法是使用单个查询但多个结果集,您可以使用
COMPUTE
来完成:You can do this with a
CROSS JOIN
and CTE, but it's not very efficient:I think a better way to get what you want would be to use a single query but multiple result sets, which you can do by using
COMPUTE
:尝试一下这个查询:
give a try for this query: