我正在尝试用编写一个查询,并得到以下错误
"IN/EXISTS predicate sub-queries can only be used in Filter/Join and a few commands"这是我正在使用的代码。
SELECT id,
(CASE WHEN id in (SELECT id from aTable) THEN 1 ELSE 0 END) as a,
(CASE WHEN id in (SELECT id from bTable) THEN 1 ELSE 0 END) as b,
(CASE WHEN id in (SELECT id from cTable) THEN 1 ELSE 0 END) as c
FROM table我读到sql不允许您这样做,因为case语句是逐行计算的,它希望阻止您为每个行的计算执行SELECT语句。如果是这样的话,是否有替代办法或解决办法来实现这一点?谢谢
发布于 2022-11-14 09:14:02
Databricks不支持使用IN或在CASE语句中存在的子查询。作为另一种选择,考虑将每个视图外部连接到主表:
查询可以类似于下面的结构:
select .....
case when a.id is not null then a
when b.id is not null then b
end as id
from Table_t t LEFT JOIN (select id from aTable ) a ON t.id=a.id LEFT JOIN(
select id from bTable) b ON t.id=b.id
..................发布于 2022-11-14 09:43:49
我试图复制类似的场景,并得到了相同的错误:

无论它是否包含在当情况下,in运算符使用子查询只在过滤器中,而不是投影。如果您在in子句中显式地提供了值,而不是使用子查询,那么它就很好用。
为了解决这个问题,我尝试向左连接到表,然后在case语句中检查null。
这个查询可能会运行
%sql
SELECT t.Id,
(CASE WHEN at.Id is not null THEN 1 ELSE 0 END) as a,
(CASE WHEN bt.Id is not null THEN 1 ELSE 0 END) as b,
(CASE WHEN ct.Id is not null THEN 1 ELSE 0 END) as c
FROM table t
LEFT JOIN aTable at ON t.Id = at.Id
LEFT JOIN bTable bt ON t.Id = bt.Id
LEFT JOIN cTable ct ON t.Id = ct.Id样本数据:

输出:

https://stackoverflow.com/questions/74426158
复制相似问题