【问题标题】:TERADATA: SQL recursive query that selects from a recursive queryTERADATA:从递归查询中选择的 SQL 递归查询
【发布时间】:2018-04-22 16:01:21
【问题描述】:

我正在尝试使用 Teradata 多次执行递归 我的查询类似于以下内容,在从 query_2 引用 query_1 并尝试运行它时会出现错误,提示 query_1 不存在。

WITH 
RECURSIVE query_1
AS (
 --some recursive query
)
   ,RECURSIVE query_2
   AS (
   --another recursive query based on results from query_1
   )
SELECT *
FROM query_2

我想连接来自不同层次结构的值 所以我想转

------------------------------------
 trx    indx1   indx2   val
------------------------------------
 x1      1       1       a
 x1      1       2       b
 x1      1       3       c
 x1      2       1       d
...................................
-----------------------------------

进入以下

----------------
 trx        val
----------------
 x1       a/b/c/d

【问题讨论】:

  • 你不能有嵌套的递归查询(我无法想象你为什么需要它)。
  • 我想连接多个层次的层次
  • 不确定 Terada,但对于标准 SQL,recursive 关键字只能在 WITH 关键字之后指定一次,无论哪个 CTE 是递归的.您是否尝试删除第二个 RECURSIVE 关键字?
  • 您可以使用 XMLAGG 连接:stackoverflow.com/a/29549409/2527905 或者您在执行层次结构查询时进行连接。
  • XMLAGG 已经为我完成了!但是 ORDER BY 仅支持一列,因此我必须在子查询中连接每个级别

标签: sql teradata recursive-query


【解决方案1】:

XMLAGG 函数解决了问题

    SELECT TRX
        , TRIM(TRAILING '/' FROM (XMLAGG(TRIM(val)|| '/' ORDER BY indx1||indx2 ASC) (VARCHAR(10000)))) val
    FROM table_name
    GROUP BY 1,2

但是,我希望 XMLAGG 中的“排序依据”支持多个表达式,这样我们就不需要子查询来连接多个层次结构。

感谢donoethsolution

【讨论】:

  • 不需要两个聚合,只需将两个列合并为一个,例如SELECT TRX , Trim(Trailing '/' FROM (XmlAgg(Trim(val)|| '/' ORDER BY indx1||indx2 ASC) (VARCHAR(10000)))) val FROM TableName GROUP BY 1
  • @dnoeth XMLAGG 在找到非英文字符时失败,有什么解决方法吗?
  • 可能不是因为 XMLAGG 而失败,而是由于会话字符集错误,应该是 UTF-8 或 UTF16。
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2020-11-27
  • 2015-07-13
  • 2014-12-19
  • 2012-12-05
相关资源
最近更新 更多