Sql 如何在teradata中获得looop等效命令
我对Teradata非常陌生。在这里,我没有看到任何循环命令来执行以下命令-- 输入结构Sql 如何在teradata中获得looop等效命令,sql,loops,case,teradata,Sql,Loops,Case,Teradata,我对Teradata非常陌生。在这里,我没有看到任何循环命令来执行以下命令-- 输入结构 A B C -- -- -- 1 b c 1 d d 1 c d 1 fx b 输出单元结构-- 在这里,如果我们使用CASE结构来实现,它将工作,如 CASE IF (B ='fx' THEN SELECT C AS A1) CASE IF(B!= 'fx' THEN SELECT C WHERE B=A1) 但是如果记录的数量更多,那么我们需要通过循环实现。有什么建议吗
A B C
-- -- --
1 b c
1 d d
1 c d
1 fx b
输出单元结构--
在这里,如果我们使用CASE结构来实现,它将工作,如
CASE
IF (B ='fx' THEN SELECT C AS A1)
CASE
IF(B!= 'fx' THEN SELECT C WHERE B=A1)
但是如果记录的数量更多,那么我们需要通过循环实现。有什么建议吗。您是在寻找
订购人吗
select t.*
from table t
order by c, b, a;
数据库中的“循环”用于基于集合的操作,如联接和分组方式。这看起来像一个层次结构,需要一些递归查询
WITH RECURSIVE cte (i, a,b,c) AS
(
SELECT 1 AS i,a,b,c
FROM tab
WHERE b = 'fx' -- start with the first value
UNION ALL
SELECT cte.i + 1, tab.*
FROM tab, cte
WHERE cte.c = tab.b -- traverse the hierarchy
AND cte.a = tab.a
AND cte.b <> cte.c -- stop if b=c
)
SELECT * FROM cte
ORDER BY i
路径VarChar的大小必须足够大,以容纳可能的最大递归级别。我不明白您想要实现什么。你想把最后一行放在第一位吗?在这里按订单不起作用。看,这是一种连锁关系。C列数据将是下一行的B列数据。所以为了得到这个king og结构循环useful@sgupdate1988 . . . 你需要澄清这个问题。此order by
生成所需的输出。好的,要求第一行B列必须用“fx”填充。对于第二行B,列数据将由第一行C列数据填充。同样,第三行B列数据将由第二行C列数据填充。所有这些记录都在输入表中,您需要按照上述规则排列这些记录。@sgupdate1988。表格表示无序的集合。没有“第一行”的概念,除非您有另一列,如标识行为第一行的id。是的,您是正确的。第一行的标识符是B列,必须用“fx”填充。因此,从输入表中,最后一行将被选为输出表的第一行,然后按照我在前面的评论中提到的规则来框定输出表中的其余行。嗨,你能告诉我,如果该行是d-b,如你所述,查询将如何进行吗。当有像d-b这样的行时,我得到了无限循环。请告诉我们这是如何工作的,或者我们可以在哪里学习这些概念。@etl_上帝:只需检查查询结果,看看它是如何工作的。路径是防止无止境循环的常见解决方案,并且还需要正确地排列层次结构。
WITH RECURSIVE cte (i, a,b,c) AS
(
SELECT 1 AS i,a,b,c
FROM tab
WHERE b = 'fx' -- start with the first value
UNION ALL
SELECT cte.i + 1, tab.*
FROM tab, cte
WHERE cte.c = tab.b -- traverse the hierarchy
AND cte.a = tab.a
AND cte.b <> cte.c -- stop if b=c
)
SELECT * FROM cte
ORDER BY i
WITH RECURSIVE cte (i, PATH, a,b,c) AS
(
SELECT CAST(1 AS SMALLINT) AS i,
'.' || CAST(TRIM(b) AS VARCHAR(10000)) || '.',
a,b,c
FROM tab
WHERE b = 'fx'
UNION ALL
SELECT cte.i + 1,
cte.PATH || TRIM(tab.b) || '.',
tab.*
FROM tab, cte
WHERE cte.c = tab.b
AND cte.a = tab.a
AND cte.PATH NOT LIKE '%.' || TRIM(tab.b) || '.%'
)
SELECT * FROM cte
ORDER BY 1;