提问人:Trevor C 提问时间:11/17/2023 更新时间:11/17/2023 访问量:22
Databricks SQL 错误 (UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY。ACCESSING_OUTER_QUERY_COLUMN_IS_NOT_ALLOWED) 使用 SQL UDF 的
Databricks SQL error (UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY.ACCESSING_OUTER_QUERY_COLUMN_IS_NOT_ALLOWED) using SQL UDF's
问:
我有一个大型工作 SQL 查询,我在 Databricks 工作区中将其参数化并注册为 SQL UDF。大型查询的部分内容在其他地方重复出现,因此,我想将其分成两个 SQL UDF:一个 coverage_cohort(),将由其他函数(condition_a()、condition_b())等调用。 在上一篇文章中,我得到了在 SQL UDF 之间传递参数时遇到的问题的答案(其中的问题是使用临时函数)。我现在正在永久注册这些功能。
所以,现在我有两个函数,coverage_cohort() 和 tdap()。tdap() 有四个参数(asofdate、age_lower、age_upper、doses),其中三个参数传递给 coverage_cohort()(其中它们被命名为 as_of_date、age_lower、age_upper)。coverage_cohort() 函数可以正常注册,并在单独调用时执行。tdap() 函数在我尝试注册时抛出以下错误:
AnalysisException: [UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY.ACCESSING_OUTER_QUERY_COLUMN_IS_NOT_ALLOWED]
Unsupported subquery expression: Accessing outer query column is not allowed in this location
Filter ((isnull(DELETION_DATE#8593) AND (cast(VACC_DATE#8574 as date) <= cast(outer(as_of_date#8401) as date))) AND (isnull(HISTORICAL#8577) OR ((HISTORICAL#8577 = Y) AND (cast(REGISTRY_ENTRY_STAMP#8728 as date) <= cast(VACC_DATE#8574 as date)))))
错误中的行引用指向 tdap() 的第一个 CTE 中的 WHERE 语句,但错误中描述的 Filter 对应于 coverage_cohort() 中的 WHERE 语句。
tdap() 错误指向的 WHERE 语句:
WHERE vm.DELETION_DATE IS NULL
AND vv.FAMILY_CODE = 24
AND vv.INVALID_REASON_CODE IS NULL
AND vv.DERIVED_DOSE is NULL
AND date(vv.VACC_DATE) BETWEEN date(pm.PAT_BIRTH_DATE) AND date(tdap.asofdate)
AND datediff(YEAR, date(pm.PAT_BIRTH_DATE), date(vv.VACC_DATE)) > 9
错误中列出的 coverage_cohort() WHERE 语句:
WHERE vm.DELETION_DATE IS NULL
AND date(vm.VACC_DATE) <= date(coverage_cohort.as_of_date)
AND (
(vm.HISTORICAL IS NULL)
OR
(vm.HISTORICAL = "Y" AND date(pm.REGISTRY_ENTRY_STAMP) <= date(vm.VACC_DATE))
)
如果很重要,coverage_cohort() 会在 FROM 语句中从 tdap() 调用一次,并在查询的后续 CTE 中调用一些 LEFT JOINS:
SELECT
...
FROM func_schema.coverage_cohort(as_of_date => tdap.asofdate, age_lower => tdap.age_lower, age_upper => tdap.age_upper) wd
LEFT JOIN tdap_cte_a ...
LEFT JOIN tdap_cte_b ...
LEFT JOIN my_db.table ...
对于缺少 reprex,我深表歉意,但我无法将问题隔离在一个较小的示例中。我也不想分享整个查询。正如我所说,较大的 UDF 在我将其拆分为两个之前已经起作用,因此,似乎我尝试在两个查询之间引用参数的方式一定有问题,但我尝试过的任何迭代都没有改变错误。谢谢!
答: 暂无答案
评论