【问题标题】:View restrictions about distinct?查看关于distinct的限制?
【发布时间】:2019-10-29 19:06:36
【问题描述】:

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

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
所以我对限制规则感到困惑?需要专家帮助。

【问题讨论】:

    标签: oracle view distinct


    【解决方案1】:

    通过对表运行 distinct 操作创建的任何视图都应该阻止您从视图中删除。使用上面的示例,我不同意您可以从 vw_tb001 中删除,即使 tb001 中没有重复项。

    【讨论】:

    • 但是我检查了 toad 或 sqlplus,这是真的(oracle 12c),我从 tb001 中删除了行,我分享这个是因为我在考试问题中看到了它,这些答案很困惑。
    • 从tb001和vw_tb001删除会有区别。您应该能够更改在这两种情况下构建视图的基础表。正如@Littlefoot 在他们的回答中显示的那样,您还可以构建一个触发器来为您执行此操作,模拟从视图中删除,但实际上只是在后台再次从表中删除。
    • 对不起,我忘记写 vw_tb001,无法编辑,我正在处理它。
    • 所以@Wano_Anth 我再次检查了蟾蜍,你是对的,我认为这是我的错 :)) 哦对不起。可能我在命令中写了表名而不是视图名,可以是这个。
    • 你能帮我解决一些问题吗?我正在准备考试,需要一些决定(第二次)
    【解决方案2】:

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

    先测试用例:

    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>
    

    关键字:而不是触发器;我将创建一个“替换”删除功能。插入或更新也可以这样做。基本上,它告诉 Oracle 在您从视图中删除时要做什么,因此 - “而不是”从视图中删除行,它会从其基础表中删除行:

    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>
    

    【讨论】:

    • 感谢您与我分享更多信息,并为我的英语不好感到抱歉,但我认为该限制在某些情况下不起作用,我在 toad 或 sqlplus 中检查了它,因为第一个版本删除是在职的。所以当你在考试中看到这些答案时会感到困惑,无法决定选择什么。我会记住你关于触发器的想法,这对我来说是新的。
    • 你能帮我解决一些问题吗?我正在准备考试,需要一些决定)))
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多