在 Oracle 中合并 table,删除条件引用源 table
Merge table in Oracle with delete condition refering to source table
对于以下问题,据说答案应该是 C。但我认为正确答案是答案 D,因为 NOT MATCHED 块将所有不匹配的记录插入目标 table。有人可以解释一下吗?
谢谢。
Q) 查看展览并检查 ORDERS_MASTER 和 MONTHLY_ORDERS table 中的数据。
评估以下 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);
以上语句的结果是什么?
一个。 ORDERS_MASTER table 将包含 ORDER_IDs 1 和 2。
乙。 ORDERS_MASTER table 将包含 ORDER_IDs 1,2 和 3.
C。 ORDERS_MASTER table 将包含 ORDER_IDs 1,2 和 4。
D. ORDERS_MASTER table 将包含订单 ID 1、2、3 和 4。
答案:C
正确答案确实是C,这是因为合并操作的来源是monthly_orders
table,它只包含两条分别是order_id
2和3的记录。
想想每条记录会发生什么:
- 对于
order_id = 2
,因为这个id存在于order_master
table,我们将执行merge语句的MATCHED
部分,更新[=16] =] 到 2500。由于此记录的数量不是 NULL
,因此 DELETE
不会执行任何操作。
- 对于
order_id = 3
,同样,id存在于order_master
table,所以我们执行merge语句的MATCHED
部分,更新[=16] =] 到 NULL
,然后在 order_master
上为我们刚刚更新的行发出 DELETE,因为 monthly_order
上的数量是 NULL
。
这给我们留下了 order_id
1、2 和 4,它们与答案 C 相匹配。
代码
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
对于以下问题,据说答案应该是 C。但我认为正确答案是答案 D,因为 NOT MATCHED 块将所有不匹配的记录插入目标 table。有人可以解释一下吗? 谢谢。
Q) 查看展览并检查 ORDERS_MASTER 和 MONTHLY_ORDERS table 中的数据。
评估以下 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);
以上语句的结果是什么?
一个。 ORDERS_MASTER table 将包含 ORDER_IDs 1 和 2。
乙。 ORDERS_MASTER table 将包含 ORDER_IDs 1,2 和 3.
C。 ORDERS_MASTER table 将包含 ORDER_IDs 1,2 和 4。
D. ORDERS_MASTER table 将包含订单 ID 1、2、3 和 4。
答案:C
正确答案确实是C,这是因为合并操作的来源是monthly_orders
table,它只包含两条分别是order_id
2和3的记录。
想想每条记录会发生什么:
- 对于
order_id = 2
,因为这个id存在于order_master
table,我们将执行merge语句的MATCHED
部分,更新[=16] =] 到 2500。由于此记录的数量不是NULL
,因此DELETE
不会执行任何操作。 - 对于
order_id = 3
,同样,id存在于order_master
table,所以我们执行merge语句的MATCHED
部分,更新[=16] =] 到NULL
,然后在order_master
上为我们刚刚更新的行发出 DELETE,因为monthly_order
上的数量是NULL
。
这给我们留下了 order_id
1、2 和 4,它们与答案 C 相匹配。
代码
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