Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在teradata中获得looop等效命令_Sql_Loops_Case_Teradata - Fatal编程技术网

Sql 如何在teradata中获得looop等效命令

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) 但是如果记录的数量更多,那么我们需要通过循环实现。有什么建议吗

我对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)

但是如果记录的数量更多,那么我们需要通过循环实现。有什么建议吗。

您是在寻找
订购人吗

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;