Я изучаю SQL в Oracle Dev Gym.Я беру класс Базы данных для разработчиков: Следующий уровень: Слияние, Крис Саксон.
Я не могу понять, как удалить строки с фильтром в целевой таблице.Даже приведенный пример не работает.Я посмотрел несколько других учебных пособий, и они тоже не работают.
Вот схема:
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) вставитьновый ряд в bfs_for_sale bricks, (2) объединить bfs в 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 ничего не делает.
Я смотрел другие учебники по слиянию и удалению и до сих пор не могу понять, как использовать merge-delete или как он должен работать.