sql - 在具有 UNION 的查询中使用 OVER()

标签 sql sql-server

我使用的是 Microsoft SQL 2012

我正在使用 OFFSET 和 FETCH NEXT 在查询中进行分页。我确实需要总体计数,所以我使用 OVER() 来获取总体计数。我遇到的问题是,当我的一个查询中有 UNION 时,OVER() 将返回 UNION 该部分的总计。

示例:

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 个结果,则每个记录的overall_count 将返回 10。但我需要统计所有记录的数量。

最佳答案

只需合并 2 个查询即可获取计数和偏移量

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

关于sql - 在具有 UNION 的查询中使用 OVER(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31571083/

相关文章:

sql - COUNT(1) OVER() with Linq to Sql

python - SQLAlchemy:如何扩展混合属性?

sql - 选择 SQL 表中的最后一行

c# - 如果从数据库获取日期,如何获取日期前 3 天?

sql-server - 别名表和更新...这段代码不应该失败吗?

with 子句中的 sql with 子句

sql - 添加具有默认值的新 SQL 列

.net - 如何从 .NET 应用程序跟踪许多 SQL Server 数据库中的更改?

mysql - 在同一张表上错误使用连接

mysql - 无法使用 select * 获取所有列