查看 distinct 的限制?

View restrictions about distinct?

我发现我们无法从视图中删除在查询中具有不同行但我想显示示例的信息:

create table tb001 ( id number );
insert into tb001 values (1); 
insert into tb001 values (2);

create table tb002 ( id number );
insert into tb002 values (1); 
insert into tb002 values (2);
insert into tb002 values (2);

create view vw_tb001 as select distinct(id) from tb001;
create view vw_tb002 as select distinct(id) from tb002;

所以在第一个版本中我们可以从视图中删除 vw_tb001,因为我们没有重复行
在第二个版本中,我们无法从视图 vw_tb002.
中删除 所以我对限制规则感到困惑?需要专家帮助。

任何由 运行 对 table 的不同操作创建的视图都应该阻止您从视图中删除。使用上面的示例,我不同意您可以从 vw_tb001 中删除,即使 tb001.

中没有重复项

从技术上讲,您仍然可以从此类视图中删除行。方法如下。

首先测试用例:

SQL> drop table tb002;

Table dropped.

SQL> create table tb002 ( id number );

Table created.

SQL> insert into tb002 values (1);

1 row created.

SQL> insert into tb002 values (2);

1 row created.

SQL> insert into tb002 values (2);

1 row created.

SQL> create view vw_tb002 as select distinct(id) from tb002;

View created.

SQL>

关键字:代替触发器;我将创建一个 "replaces" 删除功能。插入或更新也可以这样做。基本上,它告诉 Oracle 当您从视图中删除时要做什么,因此 - "instead of" 从视图中删除行,它将从其基础 table:[=15 中删除行=]

SQL> create or replace trigger trg_iof_vw
  2    instead of delete on vw_tb002
  3    for each row
  4  begin
  5    delete from tb002 where id = :old.id;
  6  end;
  7  /

Trigger created.

SQL>

让我们看看它是如何工作的:

开头内容:

SQL> select * from tb002;

        ID
----------
         1
         2
         2

SQL> select * from vw_tb002;

        ID
----------
         1
         2

正在删除:

SQL> delete from vw_tb002 where id = 2;

1 row deleted.

结果:

SQL> select * From tb002;

        ID
----------
         1

SQL> select * from vw_tb002;

        ID
----------
         1

SQL>