代码之家  ›  专栏  ›  技术社区  ›  Pedro Daniel

通过ISA关系恢复类型

sql
  •  0
  • Pedro Daniel  · 技术社区  · 17 年前

    我的数据库有7个表:一个是父级(feeds),另三个是ISA关系的子级(public feeds、private feeds、generated feeds)。在feeds表上有一个带有外键的表“subscriptions”。每个用户都可以订阅任何类型的提要。问题是每种类型的提要的视图是不同的,这意味着我需要为订阅的每种类型的提要生成不同的链接。在当前方案下,我需要执行3个查询来从提要ID中获取提要的类型。是否有更好的解决方案?

    1 回复  |  直到 17 年前
        1
  •  0
  •   Tony Andrews    17 年前

    您可以使用一个视图将子对象预联接到父对象,并获得一致的结果,而不管子对象类型是什么。例如:

    create view feed_links as
    select f.feed_name
    ,      case f.feed_type
                when 'public' then pub.x + pub.y
                when 'private' then pri.z
                when 'generated' then gen.v + gen.w
                end as link
    from   feeds f
    left outer join public_feeds pub on pub.feed_id = f.feed_id
    left outer join private_feeds pri on pri.feed_id = f.feed_id
    left outer join generated_feeds gen on gen.feed_id = f.feed_id
    where ...;
    

    或者如果提要表没有提要类型列(或等效列):

    create view feed_links as
    select f.feed_name
    ,      case when pub.feed_id is not null then pub.x + pub.y
                when pri.feed_id is not null then pri.z
                when gen.feed_id is not null then gen.v + gen.w
                end as link
    from   feeds f
    left outer join public_feeds pub on pub.feed_id = f.feed_id
    left outer join private_feeds pri on pri.feed_id = f.feed_id
    left outer join generated_feeds gen on gen.feed_id = f.feed_id
    where ...;