从表/视图创建表?

时间:2014-07-15 01:11:41

标签: sql oracle view

我有一个奇怪的场景。我试着看看我是否能找到关于这个主题的任何帮助,但我要么不知道如何正确搜索它,要么就找不到任何东西。

所以这是场景。

我有一张表A.从表T_A,我创建了一个视图V_B。现在,我可以向V_B进行更新,它运行正常。然后,当我创建一个视图V_C,它是T_A和T_D的UNION时,视图V_C是不可更新的。我理解为什么会这样的逻辑。

但我的问题是,在我合并2个表并且能够更新的地方,我能做些什么吗?

也许某种方式让表T_D扩展T_A?

一些额外的信息:T_A有1-10项,T_D有100 - 200项。我想加入它们,所以有一个可更新的表/视图,它有1-10和100-200项。

1 个答案:

答案 0 :(得分:2)

如果您有一个不可更新的视图,您可以通过在视图上定义instead of triggers来使其可更新。这意味着您需要实现逻辑以确定如何针对一个或两个基表将DML针对视图转换为DML。在你的情况下,听起来似乎是找出要更新的两个表中哪一个的逻辑。

但有几点。

  1. 如果T_AT_D的数据不重叠,则使用隐式UNION的{​​{1}}是没有意义的。你几乎肯定想要使用较便宜的DISTINCT
  2. 如果您发现自己将有关项目的数据存储在两个单独的表中,而在视图中仅将UNION ALL这两个表存储在一起,则很可能存在基础数据模型问题。如果一个项目表可能UNION ALL ITEM_TYPEA,那么似乎更有意义。
  3. 如果您使用D并拥有(或添加)非重叠约束,您可以将视图更改为partition view,则可以使您的视图可更新。这是Oracle长期以来存在的一些东西,但是在最近的版本中你没有找到关于它的大量文档,因为Oracle分区对于今天的绝大多数用例来说是一个更好的解决方案。但旧的7.3.4文档仍应有效。