我正在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子句什么也没做。
我一直在看其他合并删除教程,但仍然不知道如何使用合并删除或它应该如何工作。
答案 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子句,而蓝色的被删除了。
指定DELETE where_clause来清理表中的数据,同时 填充或更新它。 此子句影响的唯一行是 目标表中由合并更新的那些行 操作。 DELETE WHERE条件会评估更新后的值,而不是 UPDATE SET ... WHERE评估的原始值 条件。 如果目标表的某行符合DELETE 条件,但不包含在ON子句定义的连接中, 那么它不会被删除。在目标上定义的所有删除触发器 删除每行都会激活该表。