0

我很想知道是否有任何方法可以重写以下无效的 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

我收到“令牌整数无效”。有效标记:ROW ROWS 错误。

我的目标是使用第二个 WITH 语句 pull_count 来设置第一个 WITH 语句 pull 的 FETCH 限制。我只想选择一半可用的行。

有什么建议么?

4

1 回答 1

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 个进行计数,另一个获取您关心的特定行数。

于 2011-02-25T08:07:43.683 回答