首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >in / commands谓词子查询只能用于筛选器/联接和一些命令。

in / commands谓词子查询只能用于筛选器/联接和一些命令。
EN

Stack Overflow用户
提问于 2022-11-14 01:44:51
回答 2查看 54关注 0票数 0

我正在尝试用编写一个查询,并得到以下错误

代码语言:javascript
运行
复制
"IN/EXISTS predicate sub-queries can only be used in Filter/Join and a few commands"

这是我正在使用的代码。

代码语言:javascript
运行
复制
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语句。如果是这样的话,是否有替代办法或解决办法来实现这一点?谢谢

EN

回答 2

Stack Overflow用户

发布于 2022-11-14 09:14:02

Databricks不支持使用IN或在CASE语句中存在的子查询。作为另一种选择,考虑将每个视图外部连接到主表:

查询可以类似于下面的结构:

代码语言:javascript
运行
复制
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
..................
票数 0
EN

Stack Overflow用户

发布于 2022-11-14 09:43:49

我试图复制类似的场景,并得到了相同的错误:

无论它是否包含在当情况下,in运算符使用子查询只在过滤器中,而不是投影。如果您在in子句中显式地提供了值,而不是使用子查询,那么它就很好用。

为了解决这个问题,我尝试向左连接到表,然后在case语句中检查null。

这个查询可能会运行

代码语言:javascript
运行
复制
%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

样本数据:

输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74426158

复制
相关文章

相似问题

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