sql - 使用过滤器合并删除目标行的语法是什么?
问题描述
我正在 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 子句没有做任何事情。
我一直在查看其他合并删除教程,但仍然无法弄清楚如何使用合并删除或它应该如何工作。
解决方案
当匹配块未被访问。购买的砖块一开始是空的,所以没有匹配。
这个例子没有意义。为什么我们要更新一条记录,然后在同一个块中删除它?
推荐阅读
- c# - 如何禁止在发布管道中使用 PreRelease 版本的 nuget 包
- python - 创建 lib64 符号链接的 Tox 条件
- python - 如何为数据框的每一列运行 ARIMA 模型?
- r - 为 r 包提供贡献要求的标准方式?
- java - 无法从 PgBouncer 打开连接(连接尝试超时)
- python - 如何在 Python 中修复超出范围的动态列表索引
- c# - 即使我添加 AllowLoadLocalInfile,此 MySQL 版本也不允许使用的命令
- wpf - 在非 UI 线程上运行并串行运行的多个任务(非并行)
- maven - 如何为依赖项/插件生成属性版本?
- ios - 如何在具有多个部分的 TableView 中使用 searchBar?