2010-07-26 4 views
4

Pour une paire de curseurs où le nombre total de lignes dans l'ensemble de résultats est nécessaire immédiatement après la première Fetch, (après quelques essais et erreurs) je suis venu avec la requête ci-dessousQue signifie PARTITION PAR 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 

Maintenant, quand la la sortie de la requête est X lignes, rows_in_result reflète cette précision.

  • Que signifie PARTITION PAR 1?
    • Je pense il indique probablement la base de données de partitionner les résultats en morceaux de 1 rangs chaque

Répondre

9

Il est un usage inhabituel de PARTITION BY. Ce qu'il fait est de tout mettre dans la même partition de sorte que si la requête retourne 123 lignes tout à fait, alors la valeur de rows_in_result sur chaque ligne sera 123 (comme son alias l'indique).

Il est donc équivalent à plus concise:

COUNT(*) OVER() 
1

Les bases de données sont tout à fait libres d'ajouter des restrictions à la clause OVER(). Parfois, soit PARTITION BY [...] et/ou ORDER BY [...] sont des clauses obligatoires, selon la fonction d'agrégation. PARTITION BY 1 peut simplement être une clause fictive utilisée pour l'intégrité de la syntaxe. Les deux suivantes sont généralement équivalentes:

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

Notez, cependant, que Sybase SQL Anywhere et CUBRID interpréter ce 1 comme une référence d'index de colonne, similaire à ce qui est possible dans la clause ORDER BY [...]. Cela peut sembler un peu surprenant car il impose un ordre d'évaluation à la projection de la requête. Dans votre cas, ce serait alors signifie que les éléments suivants sont équivalents

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

Cet écart curieux d'autres l'interprétation de bases de données permet de référencer les expressions de regroupement plus complexes.

+0

@JeffreyKemp: J'ai vu votre commentaire sur une réponse supprimée. En fait, malheureusement, et à ma grande surprise, il existe des façons différentes d'interpréter cette expression simple. –

+0

@OMGPonies: Votre réponse d'origine (maintenant supprimée) était erronée pour Oracle, mais correcte pour les autres bases de données ... –