使用filter合并删除目标行的语法是什么?

时间:2019-05-10 20:58:16

标签: sql oracle oracle11g merge sql-delete

我正在Oracle Dev Gym上学习SQL。我正在上课的是克里斯·萨克森(Chris Saxon)的“开发人员数据库:下一级:合并”课程。

我一辈子都想不通如何删除目标表中带有过滤器的行。即使给出的示例也不起作用。我看了其他一些不同的教程,它们也不起作用。

以下是架构:

create table bricks_for_sale (
  colour   varchar2(10),
  shape    varchar2(10),
  price    number(10, 2),
  primary key ( colour, shape )
);

create table purchased_bricks (
  colour   varchar2(10),
  shape    varchar2(10),
  price    number(10, 2),
  primary key ( colour, shape )
);

insert into bricks_for_sale values ( 'red', 'cube', 4.95 );
insert into bricks_for_sale values ( 'blue', 'cube', 7.75 );
insert into bricks_for_sale values ( 'blue', 'pyramid', 9.99 );

commit;

这里是示例代码,该代码应(1)将新行插入bricks_for_sale bfs中;(2)将bfs合并到Purchased_bricks pb中;(3)从pb中删除现有的蓝色砖块。它是从教程中复制粘贴的,因此应该可以使用。

insert into bricks_for_sale values ( 'blue', 'cuboid', 5.99 );

select * from purchased_bricks;

merge into purchased_bricks pb
using bricks_for_sale bfs
on    ( pb.colour = bfs.colour and pb.shape = bfs.shape )
when not matched then
  insert ( pb.colour, pb.shape, pb.price )
  values ( bfs.colour, bfs.shape, bfs.price )
when matched then
  update set pb.price = bfs.price
  delete where pb.colour = 'blue' ;

select * from purchased_bricks;

rollback;

结果是

|COLOUR|SHAPE  |PRICE|
|------|-------|-----|
|red   |cube   |4.95 |
|blue  |cuboid |5.99 |
|blue  |cube   |7.75 |
|blue  |pyramid|9.99 |

这是预期的行为吗?我知道blue-cuboid-5.99行将保留,因为它不在源表中。但是,蓝色立方体/金字塔行是否不应该消失?看来delete子句什么也没做。

我一直在看其他合并删除教程,但仍然不知道如何使用合并删除或它应该如何工作。

2 个答案:

答案 0 :(得分:0)

不访问匹配的块。 Purchase_bricks开头是空的,因此没有匹配项。

该示例没有意义。为什么我们要更新一条记录然后在同一块中将其删除?

答案 1 :(得分:0)

delete子句有点奇怪,但是它只允许您在合并操作期间做一些额外的工作。它可以放在insert子句,update子句或两者中。使用它的关键是实现它仅在与ON子句匹配的行上运行

在您的情况下,purchased_bricks在开始时为空,因此没有任何内容与ON子句匹配,并且所有内容都通过了insert子句。因此,delete子句无效。

如果不执行回滚并运行merge语句,则可以看到此操作 第二次。

运行一次合并后:

select * from purchased_bricks;

COLOUR     SHAPE           PRICE
---------- ---------- ----------
blue       pyramid          9.99
blue       cube             7.75
red        cube             4.95
blue       cuboid           5.99

现在再次运行它,您会得到:

merge into [...]

4 rows merged.

select * from purchased_bricks;

COLOUR     SHAPE           PRICE
---------- ---------- ----------
red        cube             4.95

由于bricks_for_sale表中有一个蓝色立方体,金字塔和长方体,因此它们在on子句中都匹配,所有内容都通过了merge子句,而蓝色的被删除了。

来自documentation

  

指定DELETE where_clause来清理表中的数据,同时   填充或更新它。 此子句影响的唯一行是   目标表中由合并更新的那些行   操作。 DELETE WHERE条件会评估更新后的值,而不是   UPDATE SET ... WHERE评估的原始值   条件。 如果目标表的某行符合DELETE   条件,但不包含在ON子句定义的连接中,   那么它不会被删除。在目标上定义的所有删除触发器   删除每行都会激活该表。