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