有3个表想关联查询到结果,但实际关联感觉很慢 查询甚至20分钟才出结果第一:人员表:人员ID | 姓名 | 所在单位的ID | 所在部门的ID
------------------------------------------第二:单位部门表(单位和部门共同放在一个表里面)单位(或部门ID) | 对应单位(或部门名称)
---------------------------------------
第三:职称表所属人员ID | 职称ID | 职称名称 | 年份
-------------------------------------------现在想连接这3个表 获取人员的详细信息:人员ID | 姓名 | 所在单位名称 | 所在部门名称 | 职称名称
----------------------------问题是: 一个人有N个职称 只需要取年份最大的那个
单位部门表有很多记录 假设有10万条
职称表有很多记录 假设有600万条
人员表有很多记录 假设有60万条 请问 怎样关联或数据库如何操作 比较高效率些呢 谢谢
------------------------------------------第二:单位部门表(单位和部门共同放在一个表里面)单位(或部门ID) | 对应单位(或部门名称)
---------------------------------------
第三:职称表所属人员ID | 职称ID | 职称名称 | 年份
-------------------------------------------现在想连接这3个表 获取人员的详细信息:人员ID | 姓名 | 所在单位名称 | 所在部门名称 | 职称名称
----------------------------问题是: 一个人有N个职称 只需要取年份最大的那个
单位部门表有很多记录 假设有10万条
职称表有很多记录 假设有600万条
人员表有很多记录 假设有60万条 请问 怎样关联或数据库如何操作 比较高效率些呢 谢谢
a.人员ID,
a.姓名,
b.所在单位名称,
c.所在部门名称,
d.职称名称
from 人员表 a
left join 单位部门表 b on a.所在单位的ID=b.单位(或部门ID)
left join 单位部门表 c on a.所在部门的ID=c.单位(或部门ID)
left join 职称表 d
on a.人员ID = d.所属人员ID
and not exists(select * from 职称表 where 所属人员ID=d.所属人员ID and 年份>d.年份)这种表结构,估计也快不了...
from (select 人员表.人员ID,姓名,对应单位 from 人员表 join 单位部门表 on 人员表.所在单位ID=单位部门表ID) K
join (select 人员表.人员ID,姓名,对应单位 from 人员表 join 单位部门表 on 人员表.所在部门ID=单位部门表ID) M on K.人员ID=M.人员ID
join (select 人员id,职称名称 from 职称表 t where not exists(select 1 from 职称表 where 人员id=t.人员id and 年份>d.年份) N
on M.人员ID=N.人员ID 然后在进行连接的几个字段建立索引
create index idx_name on tb(col)
人员ID | 姓名 | 所在单位的ID | 所在部门的ID
第二:单位部门表(单位和部门共同放在一个表里面) DepartMent
单位(或部门ID) | 对应单位(或部门名称)
第三:职称表 Employee
所属人员ID | 职称ID | 职称名称 | 年份
现在想连接这3个表 获取人员的详细信息: 人员ID | 姓名 | 所在单位名称 | 所在部门名称 | 职称名称
----------------------------
select M.人员ID,M.姓名,对应单位=D.对应单位,部门名称=D.部门名称,E.职称名称
from Memer M left join DepartMent D on M.所在部门的ID=E.部门ID left join Employee E
on E.所属人员ID=M.人员ID
select M.人员ID,M.姓名,对应单位=D.对应单位,部门名称=D.部门名称,E.职称名称
from Memer M left join DepartMent D on M.所在部门的ID=E.部门ID and M.单位的ID=E.单位ID left join Employee Eon E.所属人员ID=M.人员ID
从定义上来看,应该更新不是很频繁,而且既然查不出来,就不要查了。新建一张表 TA所属人员ID | 职称ID | 职称名称 | 年份 这张表是600万记录表中年份最高职称的表,你需要写一个select 语句,把这部分数据导入到新建的表里。在600万这张表上建立触发器,把新增人员id的职称信息插入到新建立的表里,把已有人员id的信息update到表TA。这样,你关联的时候,只需要关联TA 表,既不需要 聚合 操作,也不需要关联600万的表,达到你要的要求。如果在 年份 上有 聚合操作,应该在年份上加一个 索引。希望能对你有帮助,在硬件CPU和RAM条件有限的情况下,应该考虑在磁盘空间上扩展一下。
from (
select 所属人员ID,max(年份) 年份
from 职称表
group by 所属人员ID,max(年份)
) a
left join 职称表 b on a.所属人员ID=b.所属人员ID and a.年份=b.年份把上面作为一个固实视图(企业版才有),按所属人员+年份建立视图索引
当然,职称表也需要按所属人员+年份建立视图索引