Mysql 如何将数据库子查询重写为联接?

Mysql 如何将数据库子查询重写为联接?,mysql,sql,Mysql,Sql,我正在尝试将此子查询重写为联接。我已经读了其他的问题,所以,但不能让这一个工作 create table job ( emplid int, effdt date, title varchar(100), primary key (emplid, effdt) ); insert into job set emplid=1, effdt='2010-01-01', title='Programmer'; insert into job set emplid=1, effdt=

我正在尝试将此子查询重写为联接。我已经读了其他的问题,所以,但不能让这一个工作

create table job (
  emplid int, 
  effdt date,
  title varchar(100),
  primary key (emplid, effdt)
);

insert into job set emplid=1, effdt='2010-01-01', title='Programmer';
insert into job set emplid=1, effdt='2011-01-01', title='Programmer I';
insert into job set emplid=1, effdt='2012-01-01', title='Programmer II';

insert into job set emplid=2, effdt='2010-01-01', title='Analyst';
insert into job set emplid=2, effdt='2011-01-01', title='Analyst I';
insert into job set emplid=2, effdt='2012-01-01', title='Analyst II';

#Get each employees current job:
select *
from job a
where a.effdt=
    (select max(b.effdt) 
    from job b
    where b.emplid=a.emplid);
结果:

+--------+------------+---------------+
| emplid | effdt      | title         |
+--------+------------+---------------+
|      1 | 2012-01-01 | Programmer II |
|      2 | 2012-01-01 | Analyst II    |
+--------+------------+---------------+

我想将查询重写为联接,而不使用子查询。这可能吗?

将其作为一个
连接来编写可能有点违反直觉。其思想是使用
左外连接
,并在
b.effdt>a.effdt
的条件下包含。此条件将匹配行,除非
a.effdt
具有最大值。然后,查询可以使用
进行过滤,其中

select a.*
from job a left outer join
     job b
     on  b.emplid = a.emplid and
         b.effdt > a.effdt
where b.effdt is NULL;

你考虑过重写你的模式吗? 如果可以,最好有一个历史记录或日志表,其中包含更改生效日期的条目、员工ID和以前的职务。这样,您只需查询实际表并获得所需的结果。 这可以通过在数据库中的行发生更改时使用触发器来实现,然后在数据库级别处理所有内容