14

对于一对游标,在第一次 FETCH 之后立即需要结果集中的总行数,(经过一些试验和错误)我想出了下面的查询

SELECT
 col_a,
 col_b,
 col_c,
 COUNT(*) OVER( PARTITION BY 1 ) AS rows_in_result
FROM 
 myTable JOIN theirTable ON
 myTable.col_a = theirTable.col_z
GROUP BY
 col_a, col_b, col_c
ORDER BY 
 col_b

现在,当查询的输出是 X 行时,rows_in_result 准确地反映了这一点。

  • PARTITION BY 1 是什么意思?
    • 认为它可能会告诉数据库将结果划分为每个 1 行的片段
4

2 回答 2

16

这是 PARTITION BY 的不寻常用法。它所做的是将所有内容放在同一个分区中,这样如果查询总共返回 123 行,那么每行的 rows_in_result 的值将是 123(正如其别名所暗示的那样)。

因此它相当于更简洁的:

COUNT(*) OVER ()
于 2010-07-26T20:06:19.377 回答
5

数据库可以很自由地对OVER()子句添加限制。有时,要么PARTITION BY [...]和/或是ORDER BY [...]强制性子句,具体取决于聚合函数。PARTITION BY 1可能只是用于语法完整性的虚拟子句。以下两个通常是等价的:

[aggregate function] OVER ()
[aggregate function] OVER (PARTITION BY 1)

但请注意,Sybase SQL Anywhere 和CUBRID将其解释1为列索引引用,类似于ORDER BY [...]子句中的可能。这似乎有点令人惊讶,因为它对查询的投影施加了评估顺序。在您的情况下,这意味着以下内容是等效的

COUNT(*) OVER (PARTITION BY 1)
COUNT(*) OVER (PARTITION BY col_a)

这种与其他数据库解释的奇怪偏差允许引用更复杂的分组表达式。

于 2012-12-03T11:45:55.680 回答