2010-07-26 523 views
4

对于一对光标的第一FETCH后在那里立即所需的行的在结果的总数,(经过一些尝试和错误)我想出了下面的查询PARTITION BY 1是什么意思?

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行的每件

回答

9

这是一个不寻常的使用分区BY。它所做的是将所有内容放入同一个分区,以便如果查询完全返回123行,则每行的rows_in_result值将为123(如其别名所暗示的那样)。

因此等同于更简洁:

COUNT(*) OVER() 
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) 

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

+0

@JeffreyKemp:我看到您对已删除答案的评论。事实上,不幸的是,令我惊讶的是,有*解释这个简单表达的不同方式。 – 2012-12-03 11:48:28

+0

@OMGPonies:您的原始(现已删除)答案对于Oracle是错误的,但对于其他数据库是正确的... – 2012-12-03 11:49:02