SQL - 获取某些项目的员工授权级别

时间:2017-06-29 09:04:26

标签: sql sql-server stored-procedures authorization

我正在为我们公司的员工开发一个网络应用程序。根据他们所拥有的某些培训和他们阅读的程序,可以授权某个员工在某个项目中工作。

我有几张桌子:

  • vw_Employee(存储所有员工记录,并有一个名为&#34的主键; Sicil")
  • tbl_yet_Proje(存储当时公司中可用的所有项目,并且有一个名为&#34的主要标识密钥; 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

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

1 个答案:

答案 0 :(得分: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