这是一个SQL设计问题。首先,设置。我有三个表:
例如,A包含:
B包含:
并且AtoB包含:
1,1(长颈鹿在西雅图)
2,1(猫头鹰在西雅图)
3,1(在西雅图的老虎)
2,2(猫头鹰在圣何塞)
现在,问题是:
我被要求在某些集合中包括A中找不到的项目。因此,我创建了一个表C,其标识和名称列与A相同,并填充了它。与前面的示例保持一致,假设C包含:
问题是,如何在AtoB中包含C中的项目?如果我需要在西雅图动物园里放一只龙怎么办?
我的第一个本能是天真的,是创建一个包含A和C的并集的 View V,并将AtoB修改为VtoB。那就是我天真的返回:无法创建 View 的外键。
我怀疑是否存在将一个或多个A或C与B关联的标准正确方法。
最佳答案
为了扩展Arthur Thomas的解决方案,这里是一个union
,在子选择中没有WHERE,因此您可以创建一个通用 View :
SELECT A.Name as Animal, B.Name as Zoo FROM A, AtoB, B
WHERE AtoB.A_ID = A.ID && B.ID = AtoB.B_ID
UNION
SELECT C.Name as Animal, B.Name as Zoo FROM C, CtoB, B
WHERE CtoB.C_ID = C.ID && B.ID = CtoB.B_ID
然后,您可以执行如下查询:
SELECT Animal FROM zoo_animals WHERE Zoo="Seattle Zoo"
关于多个表之间的SQL映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2044752/