Использование значения COUNT из запроса sub-SELECT для определения предела FETCH ROW - PullRequest
0 голосов
/ 25 февраля 2011

Мне интересно узнать, есть ли способ переписать следующий недопустимый запрос DB2, чтобы получить то, что мне нужно:

WITH pull AS (
    SELECT *
    FROM email_list
), 
pull_count AS (
    SELECT count(email) as email_count
    FROM email_list
)

SELECT *
FROM pull
FETCH FIRST integer(email_count / 2) ROWS ONLY

Я получаю, что токен INTEGER недействителен. Допустимые токены: ошибка ROW ROWS.

Моя цель - использовать второй оператор WITH, pull_count, чтобы установить предел FETCH для первого оператора WITH, pull. Я ищу только SELECT для половины доступных строк.

Есть предложения?

1 Ответ

2 голосов
/ 25 февраля 2011

Предложение FETCH FIRST не может использовать выражение, как вы нашли. Он принимает только неотрицательное целое число.

Нет красивого способа сделать это, но это возможно с помощью функций OLAP. Они могут отсутствовать в вашей версии DB2 (если вы используете DB2 для Linux / UNIX / Windows, то они, вероятно, есть).

Предполагается, что в вашей таблице есть столбцы email и имя:

with pull as (
   select 
      email, 
      name, 
      rownumber() over(order by email) as row, 
      count(email) over () as cnt
   from 
      email_list
)
select 
   email,
   name 
from 
   pull
where
   row <= cnt/2;

Это может не очень хорошо работать; и на самом деле может быть эффективнее просто выполнить 2 запроса: один - подсчет, а другой - выбор нужного количества строк, которые вас интересуют.

...