2017-06-29 36 views
1

我正在为我们公司的员工开发一个Web应用程序。基于他们具有的某些培训和他们阅读的程序,某个员工可以被授权在某个项目中工作。SQL - 获取某些项目的员工授权级别

我有几个表:

  • vw_Employee(存储所有员工记录,并具有识别称为“Sicil”主键)
  • tbl_yet_Proje(店当时在该公司提供的所有项目并具有所谓的“PROJ_ID”)
  • tbl_yet_ProjeEgitim(存储训练对于给定项目的先决条件的初级识别密钥,存储两个识别的键:一个是PROJ_ID,另一个是TR_ID识别需要哪些训练为相应的项目)
  • tbl_yet_ProjeProsedur(就像tbl_yet_ProjeEgitim这一个给定项目存储过程的先决条件,存储两个识别的键:一个是PROJ_ID,另一个是Pros_ID识别需要哪些程序相应的项目)
  • tbl_yet_EmployeeEgitim和tbl_yet_EmployeeProsedur(就像tbl_yet_ProjeEgitim以及tbl_yet_ProjeProsedur这两名员工分别参加了哪些培训并阅读了哪些程序。他们分别存储两个识别码:“Sicil”分别识别员工和TR_ID和Pros_ID,查看他们得到的培训或他们阅读的过程)

我想选择一个简单显示“Sicil “和他们可以工作的项目的”Proj_ID“。这意味着他们至少接受了培训并阅读了作为项目前提的程序。如果他们做得比这更多,那就没问题。我想为整个数据库做这件事,并找到每个员工的项目,他们被自动化并可能工作。

我已经在我的SQL查询中得到了这个,但它不准确。我猜测它有这么多联合行动有关:

SELECT DISTINCT emp.Sicil, proj.Proj_ID 
FROM tbl_yet_Proje proj FULL OUTER JOIN tbl_yet_ProjeEgitim pe ON proj.Proj_ID = pe.Proj_ID 
INNER JOIN tbl_yet_ProjeProsedur pp on proj.Proj_ID = pp.Proj_ID 
INNER JOIN tbl_yet_EmployeeEgitim ee ON pe.TR_ID = ee.TR_ID 
INNER JOIN tbl_yet_EmployeeProsedur ep ON ep.Pros_ID = pp.Pros_ID 
INNER JOIN vw_Employee emp ON emp.Sicil = ep.Sicil AND emp.Sicil = ee.Sicil 

任何人都可以帮助我吗? 非常感谢你

+0

??? MySQL或SQLServer?请不要垃圾标签 – RiggsFolly

+0

这是一个SQLServer对不起,我刚刚编辑它 –

+0

如果你不想从任何表中返回空值,那么你需要内部连接,而不是全部外部。 – Jayvee

回答

0

我会去员工和项目之间进行交叉连接,过滤那些没有员工完成的程序或培训。如果我没有错,下面的查询应该给你你愿意收集的结果:

select e.Sicil, 
     proj.Proj_ID 
    from tbl_yet_Proje proj, 
     vw_Employee e 
where (
     select count(*) 
      from tbl_yet_ProjeProsedur pp 
       left join tbl_yet_EmployeeProsedur ep on pp.Pros_ID = ep.Pros_ID 
                 and ep.Sicil = e.Sicil 
      where pp.Proj_ID = proj.Proj_ID 
       and ep.Pros_ID is null 
     ) = 0 
     and (
     select count(*) 
      from tbl_yet_ProjeEgitim pt 
       left join tbl_yet_EmployeeEgitim et on pt.TR_ID = ep.TR_ID 
                 and et.Sicil = e.Sicil 
      where pt.Proj_ID = proj.Proj_ID 
       and et.TR_ID is null      
     ) = 0 
+0

我很抱歉,但现在它只显示员工和项目而不涉及任何内容 –

+0

You是完全正确的:我的where语句的子查询丢失了员工的过滤器。现在它应该可以正常工作。 – xtoik

+0

对,对不起。它仍然给出相同的结果:/ –