使用postgresql中的递归创建多个递增列

时间:2017-09-07 18:06:04

标签: postgresql recursion

我正在尝试创建一个包含以下列的表:

enter image description here

我想使用with递归表来执行此操作。但是,以下代码会出现以下错误:

  

'错误:列“b”不存在'

WITH recursive numbers AS 
( 
  SELECT 1,2,4 AS a, b, c 
  UNION ALL 
  SELECT a+1, b+1, c+1 
  FROM Numbers 
  WHERE a + 1 <= 10 
) 
SELECT * FROM numbers;

我被困了,因为当我只包含一列时,这完美无缺。为什么多列出错?

1 个答案:

答案 0 :(得分:1)

这似乎是一个简单的语法问题:您错误地对列进行别名处理。 (SELECT 1,2,4 AS a, b, c)不正确。您的尝试有5列:1,2,a,b,c

将其细分为:Select 1,2,4 as a,b,c,您会看到错误,但Select 1 a,2 b,4 c工作正常。

b在基本选择中是未知的,因为它被解释为字段名称;但是没有表存在该字段。此外,由于基数中有5个字段,递归联合中有3个字段,因此联合将失败。

DEMO:http://rextester.com/IUWJ67486

可以在选择之外定义列,以便更轻松地管理或更改名称。

WITH recursive numbers (a,b,c) AS 
( 
  SELECT 1,2,4 
  UNION ALL 
  SELECT a+1, b+1, c+1 
  FROM Numbers 
  WHERE a + 1 <= 10 
) 
SELECT * FROM numbers;

或此方法在内部对字段进行别名,以便使用第一个选择列的名称。 (a,b,c)vs somereallylongalias ...在联合查询中。应该注意的是,不仅列的名称来自联合集合中的第一个查询;还有列的数据类型;哪个,必须在两个查询之间匹配。

WITH recursive numbers  AS 
( 
  SELECT 1 as a ,2 as b,4  as c
  UNION ALL 
  SELECT a+1 someReallyLongAlias
       , b+1 someReallyLongAliasAgain
       , c+1 someReallyLongAliasYetAgain
  FROM Numbers 
  WHERE a<5
) 
SELECT * FROM numbers;

最后,如果你真的想停在5,那么where子句应该是WHERE a < 5。图像描述了这一点,而查询却没有;所以不确定你的最终游戏是什么。