Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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_Database_Ms Access_Database Design_Inner Join - Fatal编程技术网

Sql 有没有可能强迫一对一的关系,而不是一对多的关系?如果没有,那怎么办?

Sql 有没有可能强迫一对一的关系,而不是一对多的关系?如果没有,那怎么办?,sql,database,ms-access,database-design,inner-join,Sql,Database,Ms Access,Database Design,Inner Join,我很快就要完成一项数据库任务,我在错误的事情上浪费了很多时间 为了简单起见,我有一个名为Character的表,它从许多表中提取信息,其中一个是Inventory。字符和库存都有一个名为Inventory_ID的字段,它是库存表中的主键 SELECT gold, char_name FROM Inventory, Character 我尝试编写一个查询以从每个字符中获取黄金,因此,例如,以下内容不是: character 1 : 200 gold character 2 : 500 gold

我很快就要完成一项数据库任务,我在错误的事情上浪费了很多时间

为了简单起见,我有一个名为Character的表,它从许多表中提取信息,其中一个是Inventory。字符和库存都有一个名为Inventory_ID的字段,它是库存表中的主键

SELECT gold, char_name
FROM Inventory, Character
我尝试编写一个查询以从每个字符中获取黄金,因此,例如,以下内容不是:

character 1 : 200 gold
character 2 : 500 gold
它表明:

character 1 : 200 gold
character 1 : 500 gold
character 2 : 200 gold
character 2 : 500 gold
在建立关系时,我注意到我无法手动更改类型。大多数情况下,这很好,但对于这一个,我认为问题是库存与角色有一对多的关系,因此每个角色都有一个库存(?)


我在这个问题上绞尽脑汁已经有一段时间了,时间不多了,我不想求助,但我看不到其他选择。

您的代码生成两个表的笛卡尔积。相反,您需要使用公共列
inventory\u id
将两个表中的行关联起来,以
联接

select i.gold, c.char_name
from inventory as i
inner join character as c on c.inventory_id = i.inventory_id
如果
字符
目录
中可能有多个匹配项,则可能需要进行聚合:

select sum(i.gold) as gold, c.char_name
from inventory as i
inner join character as c on c.inventory_id = i.inventory_id
group by c.char_name

然而,这不是你的问题所暗示的。第一个查询应该满足您的要求。

要补充@GMB答案,您可以将
字符表中的
库存Id
字段的
索引
设置为
是(无重复项)
。这将防止在MS Access中的表级别上添加重复的库存Id。这将给你一对一的关系


这确实解决了我的查询问题,但它解决了问题吗?一对一的关系是否更有意义,因为一个字符应该有一个目录,每个目录应该只属于一个字符?不过,非常感谢您的即时回复,非常感谢@马格图加:如果你有一个1-1的关系,那么规范化原则会提倡将两个表合并在一起。所以,我认为问题在于要求表是分开的,而不是我现在的做法,对吗?我应该相信Access准确地知道正确的关系是什么吗?@MagorTuga:好吧,考虑到你目前的设计,你做得不对。我的回答解释了为什么,以及如何做。修复模式本身也会很好,尽管这是一个不同的问题在ANSI-92 SQL标准中(超过25年前),用正确的ANSI
JOIN
语法替换了老式的逗号分隔表列表样式,不鼓励使用它