2010-07-26 3 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

Это необычное использование PARTITION 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: Я видел ваш комментарий к удаленному ответу. На самом деле, к сожалению, и к моему собственному удивлению, есть * разные способы интерпретации этого простого выражения. –

+0

@OMGPonies: ваш исходный (теперь удаленный) ответ был неправильным для Oracle, но правильный для других баз данных ... –