1

对于下面的问题,据说答案应该是 C。但我认为正确的答案是答案 D,因为 NOT MATCHED 块将所有不匹配的记录插入到目标表中。有人可以解释一下吗?谢谢你。

Q)查看展览并检查 ORDERS_MASTER 和 MONTHLY_ORDERS 表中的数据。

在此处输入图像描述

评估以下 MERGE 语句:

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);

上述声明的结果是什么?

A. ORDERS_MASTER 表将包含 ORDER_ID 1 和 2。

B. ORDERS_MASTER 表将包含 ORDER_ID 1,2 和 3。

C. ORDERS_MASTER 表将包含 ORDER_ID 1,2 和 4。

D. ORDERS_MASTER 表将包含 ORDER ID 1、2、3 和 4。

答案:C

4

1 回答 1

1

正确答案确实是C,这是因为合并操作的来源是monthly_orders表,表中只包含了两条记录,order_id分别为2和3。

想想这些记录会发生什么:

  • For order_id = 2,因为这个 id 存在于order_master表中,我们将执行MATCHED部分合并语句,将 更新order_total为 2500。由于这条记录的数量不是NULL,所以DELETE不会做任何事情。
  • 因为order_id = 3id 再次存在于order_master表中,所以我们执行MATCHED部分合并语句,更新order_totaltoNULL然后对order_master我们刚刚更新的行发出 DELETE on ,因为 on 的数量monthly_orderNULL

这给我们留下了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
于 2015-06-10T12:11:33.630 回答