使用来自子SELECT查询的COUNT值来确定FETCH ROW限制

时间:2011-02-24 22:34:19

标签: sql db2 fetch with-statement

我很想知道是否有办法重写以下无效的DB2 Query以获得我需要的东西:

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来设置第一个WITH语句的FETCH限制pull。我只想查看SELECT的一半可用行。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如您所见,FETCH FIRST子句不能使用表达式。它只接受一个非负整数。

没有一种方法可以做到这一点,但可以使用OLAP函数。这些可能不存在于您的DB2版本中(如果您使用的是DB2 for Linux / UNIX / Windows,那么它们可能就在那里)。

假设您的表中包含电子邮件列和名称:

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个查询可能更有效 - 1个执行计数,另一个获取您关注的特定行数。