【问题标题】:can't use JOIN with generate_series on Redshift不能在 Redshift 上使用 JOIN 和 generate_series
【发布时间】:2017-10-16 22:25:24
【问题描述】:
当在简单的选择语句中使用时,Redshift 上的

generate_series 函数按预期工作。

WITH series AS (
    SELECT n as id from generate_series (-10, 0, 1) n
) SELECT * FROM series;
-- Works fine

只要我添加一个 JOIN 条件,redshift 就会抛出

com.amazon.support.exceptions.ErrorException:函数 generate_series(integer,integer,integer)" 不支持"

DROP TABLE testing;
CREATE TABLE testing (
  id INT
);
WITH series AS (
  SELECT n as id from generate_series (-10, 0, 1) n
) SELECT * FROM series S JOIN testing T ON S.id = T.id;
-- Function "generate_series(integer,integer,integer)" not supported.

红移版本

SELECT version();
-- PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.1485

是否有任何解决方法可以使这项工作正常进行?

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    你说得对,这在 Redshift 上不起作用。 见here

    最简单的解决方法是预先“手动”创建一个永久表,其中包含该表中的值,例如您可以在该表上有 -1000 到 +1000 的行,然后从该表中选择范围,

    所以对于你的例子,你会有类似

    WITH series AS (
      SELECT n as id from (select num as n from newtable where num between -10 and 0) n
    ) SELECT * FROM series S JOIN testing T ON S.id = T.id;
    

    这对你有用吗?

    或者,如果您不能预先创建表或不想创建表,您可以使用类似的东西

    with ten_numbers as (select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0)
    ,generted_numbers AS
    (
        SELECT (1000*t1.num) + (100*t2.num) + (10*t3.num) + t4.num-5000 as gen_num
        FROM ten_numbers AS t1
          JOIN ten_numbers AS t2 ON 1 = 1
          JOIN ten_numbers AS t3 ON 1 = 1
          JOIN ten_numbers AS t4 ON 1 = 1
    )
    select  gen_num from generted_numbers
    where gen_num between -10 and 0
    order by 1;
    

    【讨论】:

      【解决方案2】:

      generate_series 不受 Redshift 支持。它只能在领导节点上独立运行。

      解决方法是对具有足够行数的任何表使用row_number

      with 
      series as (
          select (row_number() over ())-11 from some_table limit 10
      ) ...
      

      另外,这个问题已经被问过多次了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-10
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        相关资源
        最近更新 更多