rink_rewさんの投稿一覧
メディア・リカバリの流れが、
- バックアップファイルをリストア
- リストアしたファイルに対してREDOログやアーカイブREDOログを適用
という手順であることを理解しているか、を問うために選択肢に含まれている誤答であるとは推察しますが、「リカバリ」という表現だけ見ると、nonstickmite866 さんもおっしゃる通り「これはリストア後の話で、リカバリ操作で必要なのはREDOデータではないか」と捉えることもできないことはないですね。
※「リストアしたバックアップファイルにREDOを適用するんだから、バックアップファイルは必要だ」という主張もできますが、この問題の解説では「まずバックアップ・ファイルのリストアが必要です」と説明されているので、観点が違いますね。
選択肢が「リカバリにバックアップ・ファイルは必要としない」ではなく「 メディア・ リカバリにバックアップ・ファイルは必要としない」だったら、しっくりくるんですが...。
そもそも問題集の分野分けは、オラクル社公式のチェックリストのカテゴリの名称と完全に対になっているわけではなさそうですので、この辺は現在の仕様?という感じでしょうか。
必要な知識を得るという観点では、ざっとみる限り現行の問題集で一通りしっかりとカバーされているようには思いますが、将来的に、問題集の分野名も公式情報に追従する形になったらいいなと思うところでもありますね。
ON句の代わりにWHERE句に記載することは可能ですが、その場合、FROM句でJOIN句が使用できなくなるため、結合するテーブルをカンマ区切りで列挙する必要があります。
ただ、複雑なSQL文の中で出力結果に対して複数のフィルタリング条件を適用する場合など、WHERE句内にANDやORを連ねることになるので、可読性は低くなるかもしれません。
SQL> SELECT p.promo_name, p.promo_begin_date, p.promo_end_date, s.time_id, s.quantity_sold
2 FROM promotions p JOIN sales3 s
3 ON p.promo_id = s.promo_id
4 AND s.time_id BETWEEN p.promo_begin_date AND NVL(p.promo_end_date, SYSDATE);
PROMO_NAME PROMO_BE PROMO_EN TIME_ID QUANTITY_SOLD
------------------------------ -------- -------- -------- -------------
プロモーション1 10-05-10 10-05-10 10-05-10 25
プロモーション5 10-10-01 10-12-31 10-11-05 21
プロモーション2 11-08-01 12-01-01 11-10-30 34
プロモーション2 11-08-01 12-01-01 11-12-31 15
プロモーション3 12-02-22 12-04-01 9
プロモーション4 11-12-24 12-12-31 12-07-10 16
6行が選択されました。
SQL> SELECT p.promo_name, p.promo_begin_date, p.promo_end_date, s.time_id, s.quantity_sold
2 FROM promotions p JOIN sales3 s
3 WHERE p.promo_id = s.promo_id
4 AND s.time_id BETWEEN p.promo_begin_date AND NVL(p.promo_end_date, SYSDATE);
WHERE p.promo_id = s.promo_id
*
行3でエラーが発生しました。:
ORA-00905: キーワードがありません。
SQL> SELECT p.promo_name, p.promo_begin_date, p.promo_end_date, s.time_id, s.quantity_sold
2 FROM promotions p, sales3 s
3 WHERE p.promo_id = s.promo_id
4 AND s.time_id BETWEEN p.promo_begin_date AND NVL(p.promo_end_date, SYSDATE);
PROMO_NAME PROMO_BE PROMO_EN TIME_ID QUANTITY_SOLD
------------------------------ -------- -------- -------- -------------
プロモーション1 10-05-10 10-05-10 10-05-10 25
プロモーション5 10-10-01 10-12-31 10-11-05 21
プロモーション2 11-08-01 12-01-01 11-10-30 34
プロモーション2 11-08-01 12-01-01 11-12-31 15
プロモーション3 12-02-22 12-04-01 9
プロモーション4 11-12-24 12-12-31 12-07-10 16
6行が選択されました。
SQL>
「WHEN MATCHED THEN」と「WHEN NOT MATCHED THEN」の順序は入れ替えても、MERGE文としてはエラーにはなりません。
ご提示のケースでもエラーにはならず、実行後は同様の結果となりました。
SQL> select * from cust_source;
ID NAME A EMAIL BIRTH_DAY
------ ---------- - -------------------- -----------
1 scott Y scott@xx.com 66-06-03
2 allen N al@yy.com 82-04-18
3 john Y John@zz.com 73-12-30
4 king Y king@zz.com 91-01-15
SQL> select * from cust_copy;
ID NAME A
------ ---------- -
1 SCOTT Y
2 ALLEN Y
3 TBD
SQL> MERGE INTO cust_copy c USING (SELECT id, UPPER(name) name, active FROM cust_source) p ON (c.id=p.id)
WHEN NOT MATCHED THEN
INSERT VALUES (p.id, p.name, p.active)
WHEN MATCHED THEN
UPDATE SET c.name=p.name, c.active=p.active;
4行がマージされました。
SQL> select * from cust_copy;
ID NAME A
------ ---------- -
1 SCOTT Y
2 ALLEN N
3 JOHN Y
4 KING Y
SQL>
ただし、処理順序(条件を評価する順序)は変わると思うので、実運用においてはデータの内容によっては結果が異なる可能性はあります。
また、パフォーマンスにも違いが出てくる可能性はあると思います。(そのような場合には実行計画の取得などして、チューニングしていくことになると思います。)