首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >for循环中的DBT ref

for循环中的DBT ref
EN

Stack Overflow用户
提问于 2022-03-23 12:42:12
回答 1查看 1.5K关注 0票数 0

我在dbt项目"base“、"table_1”、"table_2“、”table_3“中有一个子查询列表.

我想加入到一个共同的专栏,id。

我想通过使用for循环宏来避免重复。我的问题是,当我试图引用{ref}}中的子查询名{sub}}时,会出现语法错误。

这是我试过的密码。

代码语言:javascript
运行
复制
{% set subs = ["table_1", "table_2", "table_3"] %}


SELECT
{% for sub in subs %}
    {{sub}}.* EXCEPT (id),
{% endfor %}
base.*
FROM {{ref('base')}} as base
{% for sub in subs %}
    LEFT JOIN {{ref({{sub}})}} as {{sub}}
    ON {{sub}}.id = base.id
{% endfor %}

我得到一个语法错误

expected token ':', got '}'

如果我改变到

LEFT JOIN {{ref("'"{{sub}}"'")}} as {{sub}}

我知道这个错误

expected token ',', got '{'

最后用

LEFT JOIN {{ref("{{sub}}")}} as {{sub}}

我得到了

Model depends on a node named '{{sub}}' which was not found

以下是我读过的几页,但找不到解决办法

Using a string as an argument in a Jinja macro in dbt

https://docs.getdbt.com/reference/dbt-jinja-functions/ref

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-23 15:15:36

当您使用ref()时,您已经在表达式子句({{..}})中了,因此您不需要添加另一个表达式子句来引用您的subs。

代码语言:javascript
运行
复制
{% set subs = ["table_1", "table_2", "table_3"] %}


SELECT
{% for sub in subs %}
    {{sub}}.* EXCEPT (id),
{% endfor %}
base.*
FROM {{ref('base')}} as base
{% for sub in subs %}
    LEFT JOIN {{ ref(sub) }} as {{sub}}
    ON {{sub}}.id = base.id
{% endfor %}

但是,如果您的子查询实际上是在同一模型中使用with sql子句的子查询,则不需要使用ref(),因为它们不是dbt模型。为了更好地理解ref(),您可以查看文档

代码语言:javascript
运行
复制
{% set subs = ["table_1", "table_2", "table_3"] %}


SELECT
{% for sub in subs %}
    {{sub}}.* EXCEPT (id),
{% endfor %}
base.*
FROM {{ref('base')}} as base
{% for sub in subs %}
    LEFT JOIN {{ sub }}
    ON {{sub}}.id = base.id
{% endfor %}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71587425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档