在sql中继承。如何在Table Per Type继承中创建select语句?

时间:2016-04-11 23:05:27

标签: sql inheritance

这个问题的接受答案是非常有用的: How can you represent inheritance in a database?

我真的很喜欢这种他称之为Table Per Type Inheritance:

的解决方案
CREATE TABLE policies (
   policy_id          int,
   date_issued        datetime,

   -- // other common attributes ...
);

CREATE TABLE policy_motor (
    policy_id         int,
    vehicle_reg_no    varchar(20),

   -- // other attributes specific to motor insurance ...

   FOREIGN KEY (policy_id) REFERENCES policies (policy_id)
);

CREATE TABLE policy_property (
    policy_id         int,
    property_address  varchar(20),

   -- // other attributes specific to property insurance ...

   FOREIGN KEY (policy_id) REFERENCES policies (policy_id)
);

但是,我不明白如何做一个选择陈述。在答案的最后他说:

  

现在搜索所有策略而不管子类型变得非常简单:不需要UNION - 只需要一个SELECT * FROM策略。

这将返回策略中的所有数据,但子类型呢?声明应该是这样的:SELECT * FROM policies INNER JOIN policy_motor ON policies.policy_id=policy_motor.id INNER JOIN policy_property ON policy_property.id=policies.id WHERE date_issued = yesterday

对于我的特殊情况,我有70个子类型。我是否需要内部加入所有70个表格,或者我错过了一些简单的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

首先,它不应该是 SELECT * FROM policies INNER JOIN 反而 SELECT * FROM policies LEFT JOIN 因为在"政策"表包含所有策略,以及子类型表中对它们的引用。 我认为如果您需要子类型,则必须将其作为列添加到策略表中。这样你也知道在哪里查找它。 子表的目的是避免非常长的表,这些表是一半" NULL"价值观。这样,您只需要" Parent"中所需的数据。表。您需要在父表中包含尽可能多的基本类型数据(每个策略都有一个日期开始),并且只需要您需要的数据,该数据特定于子表中的子类型。