关联子查询如何优化sql写法

【 TiDB 使用环境】

【概述】 场景 + 问题概述

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当select 中存在关联子查询时,如何进行优化。 看说明文档中有引入apply。但具体怎么修改SQL?
语句例如
select
case when 1
then (select value from table b where a.col=b.col limit 1)
else
then (select value from table c where a.col=c.col limit 1)
end
from table a

【业务影响】

【TiDB 版本】 5.7.25-TiDB-v4.0.3

用left join 试试呢

你说的是分组取组内第一条记录吧,那用cross apply就可以

第一、数据量太大,千万级的
第二、子查询中要取其中一条left join 不好实现。 试过用left join 查不出来

其实我就想问,有没有类型sql server outer apply 的写法。

迁移之前的语句太累赘复杂没啥参考意义。

outer apply 可以把需要用到的数据引入子查询取值。 left join耗费的资源就多余了…

cross apply 呢

5.7.25-TiDB-v4.0.3 这个版本我试过cross apply的写法,报错。 确定支持吗?

这个写法目前不支持。
建议提供一下表结构、脱敏数据和取数逻辑(比如:数据是一对一,还是一对多),便于调试。

1 个赞

TiDB 对关联子查询会自动使用 apply 算子,但是不支持这种语法。
我看你贴的 SQL 不是 MySQL 语法,MySQL 语法的话大概是这样:
select case when 1 then (select value from b where a.col=b.col limit 1) else (select value from c where a.col=c.col limit 1) end from a;
先看看是不是想要的效果呢?

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。