我正在尝试创建一个包含以下列的表:
我想使用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;
我被困了,因为当我只包含一列时,这完美无缺。为什么多列出错?
答案 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
。图像描述了这一点,而查询却没有;所以不确定你的最终游戏是什么。