这是一个SQL设计问题。首先,设置。我有三张桌子:
- A,根据对链接服务器的查询自动填充。该表中的数据不能更改;
- B,只有十几行,包含 As 集合的名称;
- AtoB,它是映射表,通过它将 As 组织成命名集合,两列上都有外键;
例如,A 包含:
- Giraffe
- Owl
- Tiger
B 包含:
- 西雅图动物园
- 圣何塞动物园
AtoB 包含:
1,1(西雅图的长颈鹿)
2,1(西雅图的猫头鹰)
3,1(西雅图老虎)
2,2(圣何塞的猫头鹰)
现在,问题是:
我被要求在其中一些集合中包含 A 中未找到的项目。因此,我创建一个表 C,其标识和名称列与 A 相同,并填充它。与前面的示例一致,假设 C 包含:
- Dragon
问题是,如何将 C 中的项目包含在 AtoB 中?如果我需要在西雅图动物园养一条龙怎么办?
我的第一直觉是天真的,创建一个包含 A 和 C 的并集的视图 V,并将 AtoB 修改为 VtoB。这就是我的天真得到回报的地方:人们无法为视图创建外键。
我怀疑存在一种标准、正确的方法将一个或多个 A 或 C 与 B 相关联。
为了扩展 Arthur Thomas 的解决方案,这里有一个union
子选择中没有 WHERE,以便您可以创建通用视图:
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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)