首页 > 解决方案 > 如何将子查询替换为连接查询

问题描述

我正在使用这个查询

select t.task_id,td.task_detail_id ,
(SELECT COUNT(1) FROM task_detail tdd where tdd.task_id=t.task_id and  
tdd.status='ACTIVE' ) as total
from task t inner join task_detail td  on td.task_id=t.task_id 
where td.task_id=t.task_id and td.status='ACTIVE' ; 

查询正在以预期结果运行,但我想将total column子查询更改为联接。

这是输出

标签: mysqlsqljoin

解决方案


在 MySQL 8+ 中,您将使用窗口函数

select t.task_id, td.task_detail_id,
       count(*) over (partition by t.task_id) as total
from task t inner join
     task_detail td
     on td.task_id = t.task_id 
where td.status = 'ACTIVE' ; 

在早期版本中,建议使用子查询,但您可以将其移至from子句:

select t.task_id, td.task_detail_id,
       td2.total
from task t inner join
     task_detail td
     on td.task_id = t.task_id join
     (select count(*) as total
      from task_detail td2
      where td2.status = 'ACTIVE'
      group by td2.task_id
     ) td2
     on td2.task_id = td.task_id
where td.status = 'ACTIVE' ; 

推荐阅读