请教个sql查询问题

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
回复
头像
百草谷居士
帖子: 3919
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

请教个sql查询问题

#1

帖子 百草谷居士 » 2015-11-30 20:41

有两个表 员工表 和 调整记录表,属于一对多关系。结构如下

员工表
---------------------------
员工ID 姓名
---------------------------
1 张三
2 李四
3 王五


调整记录表
------------------------------
ID 员工ID 日期 岗位
------------------------------
1 1 2015-6-6 甲车间
2 2 2015-6-6 乙车间
3 3 2015-6-6 丙车间
4 1 2015-10-1 乙车间
5 2 2015-10-2 丙车间
6 3 2015-10-3 甲车间

现在想生成一个各个员工最新岗位状况的表,形如

1 张三 乙车间 2015-10-1
2 李四 丙车间 2015-10-2
3 王五 甲车间 2015-10-3

这样的select语句该如何写呢?
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 请教个sql查询问题

#2

帖子 YeLee » 2015-12-02 12:17

代码: 全选

SELECT u.UserID, u.Username, d.Date, d.offer FROM User AS u INNER JOIN Date AS d ON u.UserID=d.UserID;
连接查询。 :em01
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
头像
astolia
论坛版主
帖子: 6444
注册时间: 2008-09-18 13:11

Re: 请教个sql查询问题

#3

帖子 astolia » 2015-12-03 13:28

和子查询连接

代码: 全选

select a."姓名",b."岗位",b."日期" from 员工表 a left join (select "员工ID", "岗位", "日期" from 调整记录表 where "ID" in (select max("ID") "ID" from 调整记录表 group by "员工ID")) b on a."员工ID" = b."员工ID";
如果用sqlite,可以简化掉一个select
头像
百草谷居士
帖子: 3919
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

Re: 请教个sql查询问题

#4

帖子 百草谷居士 » 2015-12-03 16:46

我觉得应该是

代码: 全选

select a."姓名",b."岗位",b."日期" from 员工表 a left join (select "员工ID", "岗位", "日期" from 调整记录表 where "日期" in (select max("日期") "ID" from 调整记录表 group by "员工ID")) b on a."员工ID" = b."员工ID";
试试
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
astolia
论坛版主
帖子: 6444
注册时间: 2008-09-18 13:11

Re: 请教个sql查询问题

#5

帖子 astolia » 2015-12-03 22:23

你这样是不对的。如果你要用日期,则应该同时把员工ID一同取出,才能保证唯一性。否则遇到下面这种数据会出错
------------------------------
ID 员工ID 日期 岗位
------------------------------
1 1 2015-6-6 甲车间
2 2 2015-6-6 乙车间
3 1 2015-6-7 乙车间

从你给的数据看,ID字段的数据是无重复的,而且越新加入的调整记录,其ID值也越大。
所以 select max("ID") "ID" from 调整记录表 group by "员工ID" 就足够找出每一个员工最近的一条记录了
头像
百草谷居士
帖子: 3919
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

Re: 请教个sql查询问题

#6

帖子 百草谷居士 » 2015-12-04 6:50

你说的很对,我只考虑了“最近日期”这个现实条件,没有想到在数据库实现上,其实还有一个ID可以同时起到最近日期这个功能。
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
回复