2017-06-29 33 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

對,對不起。它仍然給出相同的結果:/ –