对于一对游标,其中在第一个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会准确地反映这一点。
答案 0 :(得分:9)
这是PARTITION BY的一个不寻常的用法。它的作用是将所有内容放在同一个分区中,这样如果查询一共返回123行,那么每行的rows_in_result值将为123(正如别名所暗示的那样)。
因此相当于更简洁:
COUNT(*) OVER ()
答案 1 :(得分:1)
数据库可以自由地为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)
这种与其他数据库解释的奇怪偏差允许引用更复杂的分组表达式。