正确答案确实是C,这是因为合并操作的来源是monthly_orders
表,表中只包含了两条记录,order_id
分别为2和3。
想想这些记录会发生什么:
- For
order_id = 2
,因为这个 id 存在于order_master
表中,我们将执行MATCHED
部分合并语句,将 更新order_total
为 2500。由于这条记录的数量不是NULL
,所以DELETE
不会做任何事情。
- 因为
order_id = 3
id 再次存在于order_master
表中,所以我们执行MATCHED
部分合并语句,更新order_total
toNULL
然后对order_master
我们刚刚更新的行发出 DELETE on ,因为 on 的数量monthly_order
是NULL
。
这给我们留下了order_id
与答案 C 匹配的 1、2 和 4。
代码
CREATE TABLE orders_master (
order_id NUMBER(1) NOT NULL
,order_total NUMBER(10) NULL
)
/
CREATE TABLE monthly_orders (
order_id NUMBER(1) NOT NULL
,order_total NUMBER(10) NULL
)
/
INSERT INTO orders_master (order_id, order_total) VALUES (1, 1000)
/
INSERT INTO orders_master (order_id, order_total) VALUES (2, 2000)
/
INSERT INTO orders_master (order_id, order_total) VALUES (3, 3000)
/
INSERT INTO orders_master (order_id, order_total) VALUES (4, NULL)
/
INSERT INTO monthly_orders (order_id, order_total) VALUES (2, 2500)
/
INSERT INTO monthly_orders (order_id, order_total) VALUES (3, NULL)
/
MERGE INTO orders_master o
USING monthly_orders m
ON (o.order_id = m.order_id)
WHEN MATCHED THEN
UPDATE SET o.order_total = m.order_total
DELETE WHERE m.order_total IS NULL
WHEN NOT MATCHED THEN
INSERT VALUES (m.order_id, m.order_total)
/
COMMIT
/
SQL> select * from orders_master
2 /
ORDER_ID ORDER_TOTAL
---------- -----------
1 1000
2 2500
4