Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 数据库表按行重复数据_Database_Database Design_Many To Many_Relational Database - Fatal编程技术网

Database 数据库表按行重复数据

Database 数据库表按行重复数据,database,database-design,many-to-many,relational-database,Database,Database Design,Many To Many,Relational Database,我想比较两个表,看看员工在工作角色所需的正确“能力”中是否具有足够高的“熟练程度(基本、中级、高级)”。每个工作角色都有10种能力,但我不认为一个表包含以下内容 栏目: jobroleID,competency1,proficiency1,competency2,proficiency10,proficiency10是正确的,但我下面的选择似乎也是错误的,因为它显示了10行重复列jobroleID 表1工作角色要求 jobroleID, JRCompetence, JRProficiencyLe

我想比较两个表,看看员工在工作角色所需的正确“能力”中是否具有足够高的“熟练程度(基本、中级、高级)”。每个工作角色都有10种能力,但我不认为一个表包含以下内容

栏目:

jobroleID
competency1
proficiency1
competency2
proficiency10
proficiency10
是正确的,但我下面的选择似乎也是错误的,因为它显示了10行重复列
jobroleID

表1工作角色要求

jobroleID, JRCompetence, JRProficiencyLevel

001        205             intermediate
001        207             basic
001        301             advanced
etc
002        
表2员工当前能力

EmployeeID, EmployeeCompetence, EmployeeProficiencyLevel
E1234       205                 intermediate
E1234       207                 basic
E1234       555                 basic
etc

我很感激你给我的建议。

我认为你的基本设计很好。当您规范化数据库,使每个表仅包含有关实体的信息,并对多对多关系(如员工与能力/级别,以及工作与能力与熟练程度)建模时,重复行是一种自然结果。这种设计使得添加新需求变得很容易——您只需在job requirements表中添加新行

您的替代设计要求您在需要添加新技能时添加新列,并修改依赖于表的所有查询-显然这并不理想

然而,我会改变设计,以便将熟练程度存储在一个单独的表中,这将使顺序比较更容易(因此1=基本,2=中级,3=高级)

查找哪些员工具备特定工作所需技能的查询可以如下所示:

-- list emps who has can do job 001:
SELECT EmployeeID
FROM employee_current_capability ecc1
WHERE NOT EXISTS (
    SELECT *
    FROM job_role_requirements jrr
    WHERE jrr.jobroleID = 001
    AND NOT EXISTS (
       SELECT *
        FROM employee_current_capability ecc2
        WHERE ecc1.EmployeeID = ecc2.EmployeeID
        AND ecc2.EmployeeCompetence = jrr.JRCompetence
        AND ecc2.EmployeeProficiencyLevel >= jrr.JRProficiencyLevel
       )
    )
GROUP BY ecc1.EmployeeID;

有关一些示例,请参见此。

给出的速度和信息非常好!我真的很欣赏这段代码。谢谢,这很有帮助