web-dev-qa-db-ja.com

ビューにnull以外の列を明示的に含める方法はありますか

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が必要です。

2

ドキュメント から:

ビューに指定できるのは、一意、主キー、および外部キーの制約だけです。ただし、WITH CHECK OPTION句を使用してビューを定義できます。これは、ビューのチェック制約を指定することと同じです。

したがって、(UNION ALLインラインビューが作成された後の)基になるデータがNOT NULLであることをRDBMSに示唆する方法はないようです。

UNION/UNION ALL/INTERSECT/MINUSステートメントはすべて一致するデータ型を必要とするため、これは少しばかげているように見えます。

1
Philᵀᴹ