我有一个表格,其中包含一列代理商名称,以及一列代理商可能具备的每种技能。分配给代理的每个技能在该技能下的字段中均显示为1。
列如下所示:
+---------+----------+----------+----------+
| Name | 'Skill1' | 'Skill2' | 'Skill3' |
+---------+----------+----------+----------+
| John | 1 | | 1 |
| Sam | 1 | 1 | |
| Roberta | 1 | | 1 |
+---------+----------+----------+----------+
我想查询一个返回所有座席名称的列表,这些名称的每个特定技能都为1。查询将返回如下内容:
+-----------+
| Skill 1 |
+-----------+
| John |
| Sam |
| Roberta |
+-----------+
此外,我希望能够查询一个名称,并检索座席具有的所有技能(“名称”列的所有行均具有1英寸),如下所示:
+-----------+
| John |
+-----------+
| Skill 1 |
| Skill 3 |
+-----------+
我已经在Excel中使用索引完成了此操作,但是我是Access的新手,并且不确定如何完成此任务。
谢谢。
答案 0 :(得分:1)
您发现此任务很困难的原因之一是因为您的数据库不是normalised,所以由于数据库的结构方式,您正在使用MS Access,而不是使用它。
>因此,尽管仍然可以对当前数据进行解决,但生成的查询将很痛苦,并且可能充满了多个混乱的iif
语句或几个执行相同查询的union
查询一遍又一遍地操作,每个“技能”一个。
然后,如果您每个人都希望向数据库中添加其他技能,则必须重写所有查询!
相反,如果您的数据库被归一化(如古斯塔夫在评论中所建议),那么任务将是简单的一线工作;而且,如果以后添加新技能,您的查询将自动输出结果,就像该技能一直存在一样。
您的数据具有多对多关系:一个业务代表可能具有许多技能,并且一种技能可能为许多业务代表所了解。
因此,表示这种关系的最合适方法是使用junction table。
因此,您将拥有一个Agent表,例如:
+-----+-----------+----------+------------+
| ID | FirstName | LastName | DOB |
+-----+-----------+----------+------------+
| 1 | John | Smith | 1970-01-01 |
| ... | ... | ... | ... |
+-----+-----------+----------+------------+
这将仅包含每个代理特有的信息,即,使表中记录之间的重复信息最小化。
然后,您将有一个可能的技能表,例如:
+-----+---------+---------------------+
| ID | Name | Description |
+-----+---------+---------------------+
| 1 | Skill 1 | Skill 1 Description |
| 2 | Skill 2 | Skill 2 Description |
| ... | ... | ... |
+-----+---------+---------------------+
最后,您将拥有一个连接表,将特工链接到技能,例如:
+----+----------+----------+
| ID | Agent_ID | Skill_ID |
+----+----------+----------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 3 | 2 |
+----+----------+----------+
现在,假设您想找出哪些代理具有Skill 1
,查询很简单:
select Agent_ID from tblAgentSkills where Skill_ID = 1
如果您想找出代理商已知的技能怎么办?同样简单:
select Skill_ID from tblAgentSkills where Agent_ID = 1
当然,这些查询将仅返回联结表中显示的ID
字段-但由于ID 唯一标识在tblAgents
或{{ 1}}表中,您只需检索此类ID,即可获取其他所有必需信息:
tblSkills
答案 1 :(得分:0)
要获取所有具有skill1的代理,请打开查询设计器并创建以下查询:
这将生成以下sql
SELECT Skills.AgentName 来自技能 在哪里((((Skills.Skill1)= 1));
如果调整名称,还可以将此查询粘贴到设计器的sql窗格中,以获取所需的查询。 为了获得座席拥有的所有技能,我选择了参数化查询。打开查询设计器并创建一个新查询:
运行此查询时,它将询问您代理的名称。确保准确键入代理名称。这是生成的sql:
选择Skills.AgentName,Skills.Skill1,Skills.Skill2,Skills.Skill3 来自技能 在哪里((((Skills.AgentName)= [Agent])));
如果您继续使用此查询,我将通过将表分为技能表,特工表,技能和特工表来改进表设计。然后以多对多关系将技能和代理表链接到技能和代理表。在设计器中,获取所有座席技能的查询将如下所示: