这是一个SQL设计问题。首先,设置。我有三个表:

  • A,根据对链接服务器的查询自动填充。该表中的数据无法更改。
  • B,只有十几行,其中包含As集合的名称;
  • AtoB,这是映射表,通过该表将As组织到命名集合中,两列均带有外键;


  • 例如,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/

    10-09 08:26