1

次の質問については、答えは C であるべきだと言われています。しかし、NOT MATCHED ブロックはすべての一致しないレコードをターゲット テーブルに挿入するため、正しい答えは答え D だと思います。誰でもこれを説明できますか?ありがとうございました。

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 です。これは、マージ操作のソースが、それぞれ 2 と 3の 2monthly_ordersつのレコードのみを含むテーブルであるためです。order_id

これらの各レコードで何が起こるかを考えてください。

  • についてorder_id = 2は、この ID がorder_masterテーブルに存在するためMATCHED、merge ステートメントの一部を実行し、order_totalを 2500 に更新します。このレコードの数量は ではないためNULLDELETEは何もしません。
  • の場合order_id = 3も、id はorder_masterテーブルに存在するためMATCHED、merge ステートメントの一部を実行し、 order_totaltoを更新してから、更新したばかりの行に対してNULLDELETE を発行します。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
于 2015-06-10T12:11:33.630 に答える