正解は確かに C です。これは、マージ操作のソースが、それぞれ 2 と 3の 2monthly_orders
つのレコードのみを含むテーブルであるためです。order_id
これらの各レコードで何が起こるかを考えてください。
- について
order_id = 2
は、この ID がorder_master
テーブルに存在するためMATCHED
、merge ステートメントの一部を実行し、order_total
を 2500 に更新します。このレコードの数量は ではないためNULL
、DELETE
は何もしません。
- の場合
order_id = 3
も、id はorder_master
テーブルに存在するためMATCHED
、merge ステートメントの一部を実行し、 order_total
toを更新してから、更新したばかりの行に対してNULL
DELETE を発行します。order_master
これは、の数量が であるため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