我有两对表:
table AV, KEY AVNR //(this is the request)
table AVKW, KEY AVNR and KWCD //(these are the required qualifications for the request, N:1 to AV)
和
table EM, KEY EMNR //(this is the employee)
table EMKW, KEY EMNR and KWCD //(these are the qualifications of the employee, N:1 to EM)
示例数据:
AV:
AVNR (descr)
10 job december 10th
20 job december 11th
30 job december 12th
AVKW:
AVNR KWCD
10 operator
20 driving license
20 operator
(对于10号工作,员工必须是运营商。11日,他需要成为运营商并拥有驾驶执照。12日不需要资格)
EM:
EMNR (name)
60 John
70 Pete
80 Bert
EMKW:
EMNR KWCD
60 operator
60 driving license
70 operator
(John是拥有驾照的运营商; Pete是运营商,但没有执照.Bert根本没有资格)
对于John,查询应返回所有AV; 皮特,只有十二月。 10日和12日; 伯特,只有第12名。
从员工的角度来看,我需要知道他能满足的要求;所以我需要AV记录,其所有AVKW记录都有当前员工的AVEM记录(AV.KWCD = EM.KWCD)。
(还有一张额外的表KW,关键KWCD,列出现有资格,但现在甚至不相关)
我尝试了几种方法,但似乎都没有用......找到一个匹配的资格很容易,但是emp确实需要所有要求的资格。我将如何在SQL中编写代码?
提前致谢!
答案 0 :(得分:1)
我认为最直接的方法是选择具有匹配所需资格的员工数量等于实际资格数的员工:
select * from
(
select
av.avnr,
count(*) as qualificationCount
from
avkw
inner join
av on
avkw.avnr = av.avnr
group by
av.avnr
) as qualification
inner join
(
select
em.emnr,
avkw.avnr,
count(*) qualificationCount
from
emkw
inner join
em on
emkw.emnr = em.emnr
inner join
avkw on
emkw.kwcd = avkw.kwcd
group by
em.emnr,
avkw.avnr
) as qualified
on
qualifications.avnr = qualified.avnr
where
qualifications.qualificationCont = qualified.qualificationCount
这应列出与每个可用职位完全匹配的所有员工。
答案 1 :(得分:0)
如果您愿意使用2个查询,请尝试以下操作:
第一个保存为AV_EM_Match,将每个需求与每个员工进行比较,如果不符合条件,则返回0,如果是,则返回数字> 0;
SELECT AV.AVNR, EM.EMNR, EM.Name, AVKW.KWCD, Sum(IIf([AVKW].[KWCD] Is Null Or [AVKW].[KWCD]=[EMKW].[KWCD],1,0)) AS KW_Met
FROM AV LEFT JOIN AVKW ON AV.AVNR = AVKW.AVNR, EM LEFT JOIN EMKW ON EM.EMNR = EMKW.EMNR
GROUP BY AV.AVNR, EM.EMNR, EM.Name, AVKW.KWCD
ORDER BY AV.AVNR, EM.EMNR, AVKW.KWCD;
第二个使用它并选择符合每个要求的员工:
SELECT AV_EM_Match.AVNR, AV_EM_Match.EMNR, AV_EM_Match.Name, Min(AV_EM_Match.KW_Met) AS Selected
FROM AV_EM_Match
GROUP BY AV_EM_Match.AVNR, AV_EM_Match.EMNR, AV_EM_Match.Name
HAVING (((Min(AV_EM_Match.KW_Met))>0));
这也适用于没有要求的工作和没有资格的员工 - 所有3名员工都被选中参加第3次工作。
如果您希望按员工而非按作业排序,则可以在第二个查询中切换字段的顺序。