Tableau中递归CTE临时表方案的有效性及连接类型适配问询
关于Tableau递归CTE临时表方案的疑问解答
背景说明
在Tableau中直接使用递归CTE的自定义SQL无法运行,改用临时表方案解决:
- 先执行创建临时表的SQL:
CREATE TEMP TABLE temp_table as WITH RECURSIVE missing_dates_cte (prop_code, missing_date, present_after) AS ( SELECT prop_code, missing_date, present_after FROM missing_dates WHERE present_after IS NULL UNION ALL SELECT m.prop_code, m.missing_date, m.present_after FROM missing_dates m INNER JOIN missing_dates_cte cte ON m.prop_code = cte.prop_code WHERE m.missing_date > cte.missing_date ) SELECT * FROM missing_dates_cte;
- 再通过自定义SQL查询临时表:
SELECT * FROM temp_table
针对你提出的三个疑问,解答如下:
1. 该方案是否每日都能按预期工作?
只要你的数据库支持递归CTE和临时表(如PostgreSQL、MySQL 8.0+、SQL Server等),且missing_dates源数据每日能正常更新,这个方案可以每日正常工作。需要注意两个关键点:
- 临时表仅存在于当前数据库会话,每次重新连接Tableau、刷新数据时,都需要重新执行创建临时表的SQL
- 确保连接数据库的用户拥有创建临时表的权限
2. 创建临时表的初始SQL执行时机
创建临时表的SQL不会仅在首次创建连接时生成快照,实际执行逻辑是:
- 实时连接模式下,每次手动执行该SQL、刷新数据、重新打开工作簿建立新会话时,都会重新运行并生成新的临时表
- 临时表的生命周期绑定当前数据库会话,会话断开(比如关闭Tableau、主动断开连接)后,数据库会自动删除该临时表,下次使用必须重新创建
3. 切换为提取连接后是否存在问题?
切换为提取连接会出现直接报错的问题,原因是:
Tableau提取是在刷新提取时,从数据库拉取数据到本地文件。但临时表仅存在于特定数据库会话中,Tableau自动刷新提取时,不会先执行创建临时表的SQL,直接查询temp_table会提示表不存在。
解决建议
- 把递归CTE逻辑直接整合到提取用的自定义SQL中(如果Tableau支持在提取的自定义SQL中使用递归CTE,部分数据库适配后可以实现)
- 在数据库层面创建永久视图,替代临时表:
CREATE VIEW vw_missing_dates AS WITH RECURSIVE missing_dates_cte (prop_code, missing_date, present_after) AS ( SELECT prop_code, missing_date, present_after FROM missing_dates WHERE present_after IS NULL UNION ALL SELECT m.prop_code, m.missing_date, m.present_after FROM missing_dates m INNER JOIN missing_dates_cte cte ON m.prop_code = cte.prop_code WHERE m.missing_date > cte.missing_date ) SELECT * FROM missing_dates_cte;
之后Tableau直接连接这个视图,无论是实时还是提取模式都能正常使用。
内容的提问来源于stack exchange,提问作者jp207
相关产品推荐
相关产品推荐

