在两个表中使用子选择优化查询

Posted

技术标签:

【中文标题】在两个表中使用子选择优化查询【英文标题】:Optimizing query with subselect in two tables 【发布时间】:2021-04-09 06:54:58 【问题描述】:

employee 有两列:

ID 姓名

external_job也有两列:

ID 薪水

我必须找一个拿到最高薪水的人。 结果必须是三列一行:

ID 姓名 薪水

我进行了查询,但客户要求我不要使用子选择查询。

在这种情况下我该怎么办?

我的查询是:

select *
  from (select a.id,
               a.name,
               (select sum(salary)
                  from external_job b
                 where b.id = a.id) salary
          from employee a
         order by salary desc)
 where rownum = 1

【问题讨论】:

后端显示前端,是指浏览器会先请求go api server,然后将请求转发到next.js server,再发送response给浏览器? 用您正在使用的数据库标记您的问题。 【参考方案1】:

使用order by 和一些将结果限制为一行的方法。在标准 SQL 中,这是:

select ej.id, e.name, ej.salary
from employee e join
     external_job ej
     on ej.id = e.id
order by ej.salary
fetch first 1 row only;

并非所有数据库都支持fetch first。有些人使用limitselect top 甚至更神秘的构造。

【讨论】:

【参考方案2】:

假设ID是双方的主键。

 select  ID, NAME, SALARY from employee e ,  external_job a where e.id= a.id 
 order by salary desc
 limit 1

【讨论】:

以上是关于在两个表中使用子选择优化查询的主要内容,如果未能解决你的问题,请参考以下文章

从表中的不同条件中选择COUNT

在 where 子句中使用子查询从表中选择第二大日期

clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化(代码

PHP中的子查询

如何正确使用连接/子查询从多个表中选择数据? (PHP-MySQL)

子选择查询是不是基于它之外的 WHERE 子句进行了优化? [关闭]