Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
SQL规范化数据表并创建多个表_Sql_Ms Access - Fatal编程技术网

SQL规范化数据表并创建多个表

SQL规范化数据表并创建多个表,sql,ms-access,Sql,Ms Access,我从一个系统中得到了两个报告,我决定使用SQL通过Access来处理这些报告。一份报告称为“Evals”,另一份报告称为“Con”。目前,“Con”表尚未规范化。有称为“用户”和“用户角色”的字段,我想使用的PK是“CO_ID”。对于“CO_ID”的每个实例,都有多个不同的“用户角色”和“用户”。但是,“用户角色”仅限于选择6个。但是,对于每个“CO_ID”,一个角色可能有多个用户。这会导致多行具有相同的“CO_ID”相关数据 这两个报告的生成方式完全相同,因此每次的过程都完全相同 我需要创建一

我从一个系统中得到了两个报告,我决定使用SQL通过Access来处理这些报告。一份报告称为“Evals”,另一份报告称为“Con”。目前,“Con”表尚未规范化。有称为“用户”和“用户角色”的字段,我想使用的PK是“CO_ID”。对于“CO_ID”的每个实例,都有多个不同的“用户角色”和“用户”。但是,“用户角色”仅限于选择6个。但是,对于每个“CO_ID”,一个角色可能有多个用户。这会导致多行具有相同的“CO_ID”相关数据

这两个报告的生成方式完全相同,因此每次的过程都完全相同

我需要创建一个带有“CO_ID”的表,其他字段与“CO_ID”保持相同

自动规范化此表的最佳方法是什么

我曾尝试使用SQL解析数据,但找不到好方法。我想是这样的:

SELECT DISTINCT CO_ID, [EVERY OTHER FIELD IS THE SAME FOR CO_ID]
FROM table1;

SELECT DISTINCT User_Role
FROM table1;

SELECT DISTINCT User
FROM table1;

SELECT DISTINCT CO_ID, User_Role, User
第一个SQL命令将创建一个唯一的CO_ID列表,第二个SQL命令将为User_角色创建查找表,第三个SQL命令将为User创建一个查找表,最后一个将CO_ID与User_角色和User关联。但是,我不知道如何为所有表创建主键以将它们关联在一起。这可能也不是最好的方法,所以我对想法持开放态度

table1 = Con

CO_ID  Field1  Field2   User_Role   User
WA13    ABS 2019-02-13  Admin      User1
WA13    ABS 2019-02-13  Manager    User2
WA14    DB  2019-01-01  Secretary  User3
WA14    DB  2019-01-01  Manager    User2
WA14    DB  2019-01-01  Analyst    User4
WA14    DB  2019-01-01  Analyst    User5
WD15    ZZ  2018-11-20  Supervisor User6
WD15    ZZ  2018-11-20  Manager    User7
WD15    ZZ  2018-11-20  Admin      User8
WD15    ZZ  2018-11-20  Analyst    User9
我希望结果是什么 结果表

CO_ID   Field1  Field2
WA13    ABS   2019-02-13
WA14    DB    2019-01-01
WD15    ZZ    2018-11-20

User_Role
Admin
Manager
Secretary
Analyst
Supervisor

User
User1
User2
User3
User4
User5
User6
User7
User8
User9

用户和角色之间存在m-to-n关系,因为一个用户可以有多个角色,并且一个角色可以分配给多个用户。这种m-to-n关系需要用户和角色之间的链接表。此外,您正在为每个用户/角色关系分配一个“Con”

角色用户\u角色用户
+------------+     +----------------+       +------------+
|PK角色| | | PK用户| id|
+------------+|主键,FK用户| id |--/+------------+
|名称|+---------------------+|名称|
|| | FK co|u id ||
|            |     +----------------+       |            |
|            |                |             |            |
|            |                |             |            |
|| co v||
+------------+     +----------------+       +------------+
|PK co_id|
+----------------+
|字段1|
|字段2|
+----------------+
因此,在链接表中有一个复合主键,由
role\u id
user\u id
组成,因为每个用户/角色关系都是唯一的。此外,还有一个
co_id
作为附加信息

role
user
co
分别位于关系的一侧<代码>用户角色位于所有关系的
n

或者,也可以在用户表中设置
FK co_id
。这取决于“co”或“con”代表什么。没有更多的背景知识很难说


我认为一个用户可以有几个角色可能是错误的(因为,通过查看您的数据,用户似乎更像一名员工)。然后,您将得到这样一个结构,其中每个用户被分配一个角色和一个co:

角色
+------------+
用户-->|主键角色_id|
+------------+     /      +------------+
|PK用户| id |/|名称|
+------------+   /        +------------+
|FK角色|u id|--
|FK co|U id |--co
|姓名|+----------------+
|| \--->| PK co|U id|
|            |           +----------------+
|| |字段1|
+------------+|现场2|
+----------------+

您的表格实际上是正常的。查找表中除了键之外没有其他列,要将表链接在一起,必须重新添加键列。如果您在这里简化了示例,请尝试稍微取消简化。您希望在查找表中还有哪些列?最后3个表(缺少一个连接用户和用户角色表的表)是我希望的结果。所以表1被规范化,将变成4个表,如下面@Olivier Jacot Descombes发布的。我的问题是,如何在SQL(MS Access)中自动化表1的规范化?每次我从报告中获取table1时,都会发生相同的过程。您的第一个架构看起来正是我想要的。这就是我想做的。然而,我的问题是数据看起来像“表1”,即“Con”表。“CO_ID”是唯一的ID,它将“Con”表和“Eval”表中的所有数据关联在一起,我需要将这些数据引入到“Con”表中。我的“Eval”表有一个唯一的“CO_ID”列表,但它可能不包含所有可能的“CO_ID”,而“Con”表包含所有可能的“CO_ID”。另外,我的主要问题是,在从报告中获取“Con”表之后,如何在SQL中实现这一点。我的目标是使规范化过程自动化。最终,我的目标是创建一个仪表板。我有两张桌子:“Con”和“Eval”在“CO_ID”上连在一起。“Con”比“Eval”有更多的记录,所以我认为仪表板工具中的join没有像预期的那样工作。我想我能做的就是把“用户角色”和“用户”分开,并有三个表:“Con”、“Eval”和“Users”。我的仪表板上有一个表,显示合并的“Con”和“Eval”表,然后是第二个表,它只显示“Users”表。因此,当一个人通过特定的“CO_ID”进行过滤时,他们可以看到与之关联的特定用户。我希望这是有意义的。我通常在Access中创建一个存储查询序列,以执行按顺序执行的数据迁移。像
INSERT INTO user(name)一样,从Con中选择不同的用户,其中用户不是