Oracleでビューを作成すると、列定義のnullではない特性がベーステーブルから継承されます。
create table tq84_t (
col_1 number,
col_2 varchar2(15) not null
);
create view tq84_v as select col_1, col_2 from tq84_t;
desc tq84_v;
印刷します
Name Null? Type
--------------- -------- -----------------------------------------
COL_1 NUMBER
COL_2 NOT NULL VARCHAR2(15)
ここで、ビューのselectステートメントにunion all
が含まれている場合、その特性はもう継承されていないようです。
drop view tq84_v;
create view tq84_v as
select col_1, col_2 from tq84_t where col_1 < 10 union all
select col_1, col_2 from tq84_t where col_2 > 20;
desc tq84_v;
プリント:
Name Null? Type
--------------- -------- -----------------------------------------
COL_1 NUMBER
COL_2 VARCHAR2(15)
これは私の目的には少し残念です。それで、Oracleのビューに対して列がnot null
であることを明示的に述べる方法はありますか?
注:問題を説明するために単純なビュー定義を使用したことは明らかで、union all
を使用せずにビュー定義を書き直すことができました。しかし、私のactualビュー定義ははるかに複雑で、union all
が必要です。
ドキュメント から:
ビューに指定できるのは、一意、主キー、および外部キーの制約だけです。ただし、WITH CHECK OPTION句を使用してビューを定義できます。これは、ビューのチェック制約を指定することと同じです。
したがって、(UNION ALL
インラインビューが作成された後の)基になるデータがNOT NULL
であることをRDBMSに示唆する方法はないようです。
UNION
/UNION ALL
/INTERSECT
/MINUS
ステートメントはすべて一致するデータ型を必要とするため、これは少しばかげているように見えます。