我正在为以下要求创建数据库架构: 员工具有某些属性。在作业中可以找到这些相同的属性。 我需要做的是根据给定工作的属性搜索员工。例如,"找到所有匹配作业ID = 1并且具有相同属性的员工"。 (用于搜索特定员工的所有工作的Versa副总裁)。这是我的数据库架构。
Job (
jobId,
description
)
Employee(
employeeId,
firstName,
lastName,
startDate,
email
)
Attribute(
attributeId,
description
)
JobAttribute(
jobId, (FK to Jobs.jobId)
attributeId (FK to Attributes.attributeId)
)
EmployeeAttribute(
employeeId, (FK to Employees.employeeId)
attributeId (FK to Attributes.attributeId).
)
查询"找到所有匹配作业ID = 1并且具有相同属性的员工#34;。然后看起来像:
SELECT DiSTINCT e.employeeId
FROM Employee e
INNER JOIN EmployeeAttribute ea
ON e.attributeId = ea.AttributeId
and e.employeeId = ea.employeeId
WHERE ea.AttributeId In (
Select ja.attributeId
FROM Job j
inner join JobAttribute ja
on j.jobId = ja.jobId
inner join AttributeTable at
on ja.attributeId = at.attributeId
where jobId = 1
)
order by e.startDate asc
该查询将返回至少具有与作业相同的一个属性的所有员工。
如果我需要返回根据使用此架构的作业分配了所有属性的所有员工,查询将如何?
这是一个很好的查询性能设计。我还希望尽可能灵活地允许以最少的代码更改添加新属性。
答案 0 :(得分:1)
好的,您的第一个查询“找到符合作业ID = 1并且具有相同属性的所有员工”,可以更简单,如下所示
SELECT DISTINCT E.EmployeeId
FROM
Employee E
INNER JOIN EmployeeAttribute EA ON (EA.EmpId = E.EmployeeId)
INNER JOIN JobAttribute JA ON (EA.AttributeId = JA.AttributeId)
WHERE AJ.JobId = 1
关于检索匹配给定作业的所有属性的员工的查询
SELECT EA.EmployeeId, COUNT(EA.EmployeeId)
FROM EmployeeAttribute EA
INNER JOIN JobAttribute JA on EA.AttributeId = JA.AttributeId
WHERE JA.JobId = @jobId
GROUP BY EA.EmployeeId
HAVING COUNT(EA.EmployeeId) >= (SELECT COUNT(AttributeId) FROM JobAttribute J where J.JobId = @jobId)
您可能需要加入Employee master才能获得该员工的其他详细信息。两个查询都假设派生表上有一个PK,它是两个FK的组合。
在性能方面,使用查询执行计划并相应地定义索引。