一个表中的多个外键链接到第二个表中的单个主键

时间:2010-12-30 21:43:40

标签: sql foreign-keys primary-key join

我有一个包含三个表的数据库,一个家庭表,一个成人表和一个用户表。 Household表包含两个外键,iAdult1ID和iAdult2ID。 Users表具有iUserID主键,Adult表具有相应的iUserID外键。 Users表中的一列是strUsername,一个电子邮件地址。

我正在尝试编写一个查询,允许我搜索与家庭有关系的成年人的电子邮件地址。所以我有两个问题,假设所有值都不为空,我该怎么做?

两个,实际上,iAdult2ID可以为null,是否仍然可以编写查询来执行此操作?

感谢您的帮助。如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:3)

是的,您刚刚两次加入同一张桌子:

select u1.strUsername, u2.strUsername
FROM Household h
LEFT JOIN Adult a1 on a1.ID = h.iAdult1ID
LEFT JOIN Users u1 on u1.ID = a1.iUserID
LEFT JOIN Adult a2 on a2.ID = h.iAdult2ID
LEFT JOIN Users u2 ON u2.ID = a2.iUserID

答案 1 :(得分:2)

虽然接受的答案是正确的,但我认为指出原始问题是数据建模方式的结果会有所帮助。

理想情况下,您应将AdultIds移出HouseHold表并移至名为HouseholdAdults的新表中,该表包含HouseholdId和iAdultId。那么每个家庭可以有一个或多个成年人。

下面是截图,说明我的意思。


alt text


目前,您已将成人与家庭之间的关系限制在至少一个且不超过两个。没有成人或三个人的房子怎么样?此外,在添加成人记录之前,您无法添加家庭记录?您在哪里存储有关成人与家庭关系的信息?例如,谁是所有者,租户,当他们搬进去,买了它等等。基本上任何与这种关系有关的东西。

目前这些对你来说可能都不是问题,但我认为仍然值得一些思考。

然后,此重新构建可以解决查询数据时遇到的问题。使用新表加入家庭餐桌和成人餐桌,您可以轻松地查询以下关系。

SELECT Adult.iAdultId, Household.HouseHoldId, Users.strUserName FROM Adult 
INNER JOIN HouseholdAdults ON Adult.iAdultId = HouseholdAdults.iAdultId 
INNER JOIN Household ON HouseholdAdults.HouseholdId = Household.HouseHoldId 
INNER JOIN Users ON Adult.iUserId = Users.iUserId

下面是一些链接进一步解释 Many-to-Many relations
Database normalization