Sql 有没有可能强迫一对一的关系,而不是一对多的关系?如果没有,那怎么办?
我很快就要完成一项数据库任务,我在错误的事情上浪费了很多时间 为了简单起见,我有一个名为Character的表,它从许多表中提取信息,其中一个是Inventory。字符和库存都有一个名为Inventory_ID的字段,它是库存表中的主键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
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年前),用正确的ANSIJOIN
语法替换了老式的逗号分隔表列表样式,不鼓励使用它