仅使用所有匹配键查找记录

时间:2016-12-07 11:37:25

标签: sql ms-access

我有两对表:

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中编写代码?

提前致谢!

2 个答案:

答案 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次工作。

如果您希望按员工而非按作业排序,则可以在第二个查询中切换字段的顺序。