查找记录只有在所有匹配的密钥

问题描述:

我有两个表对:查找记录只有在所有匹配的密钥

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) 

AND:

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 

(约翰是驾驶执照的驾驶员;皮特是运营商,但没有许可证。伯特根本没有资格)

对于约翰,查询应该返回所有的AV;皮特,只有十二。 10日和12日;对于伯特来说,只有第12名是 。

从员工的角度来看,我需要知道他能满足什么要求;所以我需要所有AVKW记录与当前员工匹配的AVEM记录(AV.KWCD = EM.KWCD)的AV记录。

(有额外的表KW,关键KWCD,列出了现有的资格,但现在甚至不相关)

我试过多种方法,但没有一个似乎工作...找到一个匹配的资格很容易,但是emp确实需要所有要求的资格。我将如何在SQL中编码?

在此先感谢!

+2

(1)用您正在使用的数据库标记问题; (2)样本数据将澄清你想要做的事情。 –

我认为最简单的方法是选择具有等于实际资质的计数所需的配套资格的计数员工:

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 

这应当列出所有的员工,每个可用的位置完全匹配。

+0

谢谢,这是我还没有尝试的方法...我必须摆弄一下(我正在从emp看,所以我不需要一个emp列表,但请求列表等)...然后这是一个更大的SQL语句的一部分,我必须找到一些方法来保持它的可管理性...会让你知道! – Jur

+0

是的 - 我一直在想这是一个更大的查询的中心部分 - 也许这个查询进入一个视图,并用它来探测更多的细节 – Clay

+0

是的,这工作得很好。只有缺失的记录是没有资格的请求,所以我添加了一个AV LEFT JOIN AVKW的UNION,并将雇员号码参数化(我现在不需要结果给所有人)。非常感谢! – Jur

如果你是开放的,使用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名员工都被选为第三职位。

如果您希望他们按员工排序,而不是按职位排序,您可以切换第二个查询中字段的顺序。