12

検索した結果、オンラインまたは他のリソースで何も見つかりませんでした。別のビューと他のテーブルを結合してビューを形成できるかどうか疑問に思っていましたか? これに似たものは、Server_ref.part_notification_view が参加するビューであると思います。

Create View "PART_NOTIFICATION_VIEW" ("NOTIFICATION_IX", "PART_NBR", "MFG_CD", "PART_CLASS_CD", "LEADTIME", "BILLTO_CUST_NBR", "BILL_TO_ACCT_NM", "CUST_PART_NBR", "LAST_CUST_PO", "LAST_REQ_DT", "QTY_OPEN", "YEAR_USAGE", "AVAILABLE_SALE_STANDARD_QT", "ISSUE_DATE", "EFFECTIVE_DATE", "BRIEF_DESCRIPTION", "NOTIFICATION_TYPE", "ACTUAL_DOCUMENT_LINK", "AFFECTED_PARTS_LIST_DOC_LINK", "EMAIL_LINK", "FILE_FOLDER", "RECOMMENDED_REPLACEMENT", "PCN_TYPE", "IMPACT", "MANUFACTURER_NM", "LAST_BUY_DT", "LAST_SHIP_DT", "SALES_MIN_BUY_QTY", "SALES_MIN_PKG_QTY", "PART_DESC", "BOND_QOH", "BOND_QIT", "BRANCH_QOH", "BRANCH_QIT", "BOND_QTY", "BOND_PIPELINE", "BOND_OP", "BRAND_CD", "STATUS", "COMMENTS")
AS
  SELECT
    svr.notification_ix,
    svr.part_nbr,
    svr.mfg_cd,
    svr.part_class_cd,
    svr.leadtime,
    svr.billto_cust_nbr,
    svr.bill_to_acct_nm,
    svr.cust_part_nbr,
    svr.last_cust_po,
    svr.last_req_dt,
    svr.qty_open,
    svr.year_usage,
    svr.available_sale_standard_qt,
    svr.issue_date,
    svr.effective_date,
    svr.brief_description,
    svr.notification_type,
    svr.actual_document_link,
    svr.affected_parts_list_doc_link,
    svr.email_link,
    svr.file_folder,
    svr.recommended_replacement,
    svr.pcn_type,
    svr.impact,
    svr.manufacturer_nm,
    svr.last_buy_dt,
    svr.last_ship_dt,
    svr.sales_min_buy_qty,
    svr.sales_min_pkg_qty,
    svr.part_desc,
    NVL(svr.bond_qoh, 0)                                                                    AS bond_qoh,
    NVL(svr.bond_qit, 0)                                                                    AS bond_qit,
    NVL(svr.branch_qoh, 0)                                                                  AS branch_qoh,
    NVL(svr.branch_qit, 0)                                                                  AS branch_qit,
    NVL(svr.bond_qoh, 0)      + NVL(svr.bond_qit, 0) + NVL(svr.branch_qoh, 0) + NVL(svr.branch_qit, 0) AS bond_qty,
    NVL(svr.bond_pipeline, 0) + NVL(svr.po_qt, 0)                                                 AS bond_pipeline,
    svr.bond_op,
    svr.brand_cd,
    cs.status,
    cc.comments
  FROM part_notification_view svr
  JOIN css_status cs
  ON svr.part_nbr = cs.part_nbr
  AND svr.mfg_cd = cs.mfg_cd
  AND svr.billto_cust_nbr = cs.account
  JOIN css_comment cc
  ON svr.part_nbr = cc.part_nbr
  AND svr.mfg_cd = cc.mfg_cd
  AND svr.billto_cust_nbr = cc.account;
4

2 に答える 2

19

確かに、別のビューの上に構築されたビューを持つことができます:

create table my_table (id number, name varchar2(20), address varchar2(30));

table MY_TABLE created.

create or replace view my_view_1 as
select id, name
from my_table;

view MY_VIEW_1 created.

create or replace view my_view_2 as
select mv1.id, mv1.name, mt.address
from my_view_1 mv1
join my_table mt on mt.id = mv1.id;

view MY_VIEW_2 created.

ただし、ビューの一部ではないフィールドを含め、基になるテーブルでは何も参照できません。

create or replace view my_view_3 as
select mv1.id, mv1.name, mv1.address
from my_view_1 mv1
join my_table mt on mt.id = mv1.id;

SQL Error: ORA-00904: "MV1"."ADDRESS": invalid identifier
00904. 00000 -  "%s: invalid identifier"

同じ列を持つ基になるテーブルは問題ではありません。ビューに複数のテーブルを含める場合は、とにかくエイリアスを作成する必要があります。

これを行うとパフォーマンスの問題が発生する場合があり、同じベース テーブルに対して新しいビューを作成し、それを拡張して必要な追加データを含めると、より高速で信頼性が高くなる可能性がありますが、維持するのが難しい場合があります。

于 2013-02-12T14:46:40.870 に答える
6

長い答え...

テーブル、クエリの結果、およびビュー (単に保存されたクエリ) の間に論理的な違いがあってはならないことは、リレーショナル データベースの基本的な特徴の 1 つです。実際、「リレーショナル」とは、これらのいずれかを介してアクセスできるデータの行を指します。http://en.wikipedia.org/wiki/Relation_%28database%29

もちろん、特に DDL コマンド (update、delete、insert) に関しては、RDBMS ごとにさまざまな程度の違いが課されており、DDL を適用できるオブジェクトの種類にすべての制限が課されています。

Oracle を例にとると、システムはキー保存ビューの更新と削除を許可し、挿入は可能ですが、実際にはほとんど使用されません (「代わりに」トリガー タイプを使用して、任意のビューに対して DDL を許可できます)。

したがって、これらすべてを考慮して、次に対して選択を実行できます。

  1. テーブル
  2. 結合されたテーブルのセット
  3. ビュー
  4. クエリ (一般にインライン ビューと呼ばれます)
  5. ビューとテーブルに結合されたクエリ

...したがって、その選択はビュー定義にカプセル化できます。

短い答え: はい

于 2013-02-12T15:11:14.043 に答える