使用Oracle 11g RAC
我想根据条件使用INSERT ALL插入一个或两个表。我试图在常规SQL中执行此操作,而不是在可能的情况下执行此操作。我读取了SELECT部分中的变量需要满足的WHEN条件,但我不确定是否有一些Oracle技巧可以返回我需要的东西。这就是我想要做的事情:
INSERT ALL
--if the order from table A doesnt exist in table B then insert it
WHEN ( if a.ord_id = b.ord_id then skip) THEN
INTO tableB (ord_id, ord_dt, ord_type, ord_sys) VALUES (ord_id,ord_dt, ord_type,ord_sys)
--always insert into table C
WHEN 1=1 THEN
INTO tableC (ord_id, item_id, item_dt) VALUES (ord_id, 1234, SYSDATE)
SELECT a.ord_id, a.ord_dt, a.ord_type, a.ord_sys
FROM tableA a, tableB b
WHERE a.ord_id = b.ord_id
AND ord_type = 'N';
我尝试了几种不同的东西,但似乎无法让条件真正发挥作用。我认为上面的逻辑不会起作用,因为它完全消除了选择,但我认为它会更容易理解。任何帮助,将不胜感激。
答案 0 :(得分:0)
你问题是你的第一个问题; WHEN ( if a.ord_id = b.ord_id then skip) THEN
conditional insert clause(因为它显然已知)实际上看起来像这样(为便于阅读而简化)
[ ALL | FIRST ]
WHEN condition
THEN insert_into_clause
[ values_clause ]
[ insert_into_clause [ values_clause ] ]...
[ WHEN condition
THEN insert_into_clause
[ values_clause ]
]...
[ ELSE insert_into_clause
[ values_clause ]
]
正如您所见,WHEN只需要一个条件,即a.ord_id = b.ord_id
之类的布尔语句。您不能使用IF语句或其他关键字,例如SKIP。
您在代码中的评论是"如果表A中的订单不存在于表B中,则将其插入" 。如果在tablea
和tableb
之间执行外连接,则b中的不存在由订单为NULL定义(请参阅A Visual Explanation of SQL Joins)。您可以使用此事实来创建条件
insert all
when b.ord_id is null then
into tableb (ord_id, ord_dt, ord_type, ord_sys)
values (ord_id, ord_dt, ord_type, ord_sys)
when 1 = 1 then
into tablec (ord_id, item_id, item_dt)
values (ord_id, 1234, sysdate)
select a.ord_id, a.ord_dt, a.ord_type, a.ord_sys
from tablea a
left outer join tableb b
on a.ord_id = b.ord_id
where a.ord_type = 'N';
如果ORD_TYPE
实际上在tableb
中,则您必须删除WHERE子句并将此条件添加到JOIN中。