大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)

Posted

技术标签:

【中文标题】大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)【英文标题】:Big Query: Join with function outcome (ERROR: Subquery in join predicate should only depend on exactly one join side.) 【发布时间】:2021-12-13 22:14:49 【问题描述】:

我想使用我编写的函数的结果连接两个表。函数返回一个布尔值。

但是它说:连接谓词中的子查询应该只依赖于一个连接端。

这里有什么问题?

代码:

CREATE TEMPORARY FUNCTION array_intersect(x ANY TYPE, y ANY TYPE) AS (
(
SELECT count(*) > 0
from 
        (
            select xe_1 from 
            (select JSON_EXTRACT_ARRAY(x) as xe), unnest(xe) as xe_1
        ) t1
 inner join
        (
            select ye_1 from 
            (select JSON_EXTRACT_ARRAY(y) as ye), unnest(ye) as ye_1
        ) t2 
on t1.xe_1 = t2.ye_1
)
);

WITH
k AS (
  SELECT
    FORMAT("%T", JSON_EXTRACT_ARRAY('["a","b","c"]')) AS x, date('2021-11-11') as date_x),

m as (
  SELECT
    FORMAT("%T", JSON_EXTRACT_ARRAY('["a","c"]')) AS y, date('2021-11-11') as date_y)


SELECT * from
 k t1
inner join 
(select * from m) t2 
on (select array_intersect(x_1, y_1) FROM (SELECT t1.x AS x_1, t2.y AS y_1))

非常感谢=)

【问题讨论】:

join 上的子句 on 要求和表达式有 2 个边,我的意思是 on x.a=x.b,你不能只使用布尔条件。 【参考方案1】:

join 上的子句要求和表达式有 2 个边,我的意思是在 x.a=x.b 上,你不能只使用布尔条件。

另外,你的逻辑也有错误。您只是发送一个true,它没有链接到任何线路。不接缝是您需要功能的情况。在最终查询中直接使用连接。


WITH
k AS (
  SELECT
    FORMAT("%T", JSON_EXTRACT_ARRAY('["a","b","c"]')) AS x, date('2021-11-11') as date_x),

m as (
  SELECT
    FORMAT("%T", JSON_EXTRACT_ARRAY('["a","c"]')) AS y, date('2021-11-11') as date_y)


select tx.*,ty.* from
(select * from m, unnest(JSON_EXTRACT_ARRAY(y)) as y_1) as ty
inner join
(select * from k, unnest(JSON_EXTRACT_ARRAY(x)) as x_1) as tx
on 
ty.y_1=tx.x_1

您还可以使用DISTINCT 语句删除冗余:

select distinct x,date_x,y,date_y from
(select * from m, unnest(JSON_EXTRACT_ARRAY(y)) as y_1) as ty
inner join
(select * from k, unnest(JSON_EXTRACT_ARRAY(x)) as x_1) as tx
on 
ty.y_1=tx.x_1

【讨论】:

以上是关于大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)的主要内容,如果未能解决你的问题,请参考以下文章

大数据SparkSql连接查询中的谓词下推处理

在 Redshift 更新查询中使用左外连接导致错误:目标表必须是等连接谓词的一部分

QueryDSL 在构建谓词查询时添加交叉连接

上)

上)

上)