Sql 在具有并集的查询中使用OVER()
我正在使用Microsoft SQL 2012 我在查询中使用OFFSET和fetchnext进行分页。我确实需要总计数,但我使用OVER()来获取总计数。我遇到的问题是,当我在一个查询中有一个并集时,OVER()将返回该部分并集的总数 例如:Sql 在具有并集的查询中使用OVER(),sql,sql-server,Sql,Sql Server,我正在使用Microsoft SQL 2012 我在查询中使用OFFSET和fetchnext进行分页。我确实需要总计数,但我使用OVER()来获取总计数。我遇到的问题是,当我在一个查询中有一个并集时,OVER()将返回该部分并集的总数 例如: SELECT something ,overall_count = COUNT(*) OVER() FROM tbl_something WHERE something = @someparameter UNION SELECT some
SELECT something
,overall_count = COUNT(*) OVER()
FROM tbl_something
WHERE something = @someparameter
UNION
SELECT something
,overall_count = COUNT(*) OVER()
FROM tbl_something
WHERE something = @someOtherParameter
OFFSET (@intPage - 1) * 50 ROWS
FETCH NEXT 50 ROWS ONLY
在上面的示例中,如果查询中的每个SELECT语句有10个结果,则每个记录的总计数将返回为10。但我需要清点所有的记录 您是否尝试过在您的工会周围附加Select语句?就像下面
SELECT * FROM (
SELECT something
,overall_count = COUNT(*) OVER()
FROM tbl_something
WHERE something = @someparameter
UNION
SELECT something
,overall_count = COUNT(*) OVER()
FROM tbl_something
WHERE something = @someOtherParameter
) a
ORDER BY something
OFFSET (@intPage - 1) * 50 ROWS
FETCH NEXT 50 ROWS ONLY
只需要组合这两个查询,然后得到您的计数和偏移量
SELECT *,
overall_count = COUNT(*) OVER()
FROM (
SELECT something
FROM tbl_something
WHERE something = @someparameter
UNION
SELECT something
FROM tbl_something
WHERE something = @someOtherParameter
) u
ORDER BY something
OFFSET (@intPage - 1) * 50 ROWS
FETCH NEXT 50 ROWS ONLY
或者你可以使用cte,如果它更有意义的话
;WITH cte AS (
SELECT something
FROM tbl_something
WHERE something = @someparameter
UNION
SELECT something
FROM tbl_something
WHERE something = @someOtherParameter
)
SELECT *,
overall_count = COUNT(*) OVER()
FROM cte
ORDER BY something
OFFSET (@intPage - 1) * 50 ROWS
FETCH NEXT 50 ROWS ONLY
我有,但似乎没有帮助。。。除非我做错了什么,否则需要一个
orderby
子句。您是否在OFFSET
子句之前包含了一个?@jradich1234您仍然无法获得每行所有记录的总数。我不知道需要ORDER BY。我没有将它们包括在我的示例中,因为我不知道它们是相关的,但它存在于我的查询中
SELECT something
,overall_count = COUNT(*) OVER()
FROM tbl_something
WHERE something in (@someparameter, someOtherParameter)
order by something
OFFSET (@intPage - 1) * 50 ROWS
FETCH NEXT 50 ROWS ONLY