首页 > 解决方案 > 使用过滤器合并删除目标行的语法是什么?

问题描述

我正在 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 合并到 purchase_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 子句没有做任何事情。

我一直在查看其他合并删除教程,但仍然无法弄清楚如何使用合并删除或它应该如何工作。

标签: sqloracleoracle11gmergesql-delete

解决方案


当匹配块未被访问。购买的砖块一开始是空的,所以没有匹配。

这个例子没有意义。为什么我们要更新一条记录,然后在同一个块中删除它?


推荐阅读