データベース上にビューを作成します。
CREATE [ OR REPLACE ] VIEW [ owner.]view-name [ ( column-name, ... ) ] AS query-expression [ WITH CHECK OPTION ]
OR REPLACE 句 OR REPLACE (CREATE OR REPLACE VIEW) を指定すると、新しいビューが作成されるか、同じ名前の既存のビューが置き換えられます。OR REPLACE 句を使用する場合、既存のパーミッションは保持されますが、ビューの INSTEAD OF トリガーは削除されます。
1 つ以上の INSTEAD OF トリガーがあるビューで CREATE OR REPLACE VIEW 文を実行すると、エラーが返されます。トリガーを削除してからでないと、ビューを削除または変更できません。
AS 句 ビューのベースとなる SELECT 文です。SELECT 文はローカルテンポラリテーブルを参照してはなりません。また、query-expression には GROUP BY 句、HAVING 句、WINDOW 句、または ORDER BY 句を指定でき、UNION、EXCEPT、INTERSECT または共通テーブル式を含めることができます。
クエリのセマンティックは、クエリが ORDER BY 句を SELECT 文の TOP または FIRST 句と組み合わせないと、返されるローの順序が定義されないことを記述します。ORDER BY 句が TOP または FIRST 句のいずれかと共に指定されている場合、クエリはそれぞれ上位 n ロー、または 1 番目のローを返します。
WITH CHECK OPTION 句 WITH CHECK OPTION 句を指定すると、query-expression で定義された条件を満たさないビューへの更新や挿入が拒否されます。
ビューは物理的にはテーブルとしてデータベースの中に存在しません。ビューは使用するたびに引き出されます。ビューは、CREATE VIEW 文で指定された SELECT 文の結果として引き出されます。ビューの中で使用するテーブル名は、テーブルを同じ名前のテーブルと区別するために、テーブルの所有者のユーザー ID を指定する必要があります。別のユーザーが所有するビューを作成するには、DBA 権限を持ち、所有者を指定する必要があります。
SELECT、DELETE、UPDATE、INSERT 文の中では、ビュー名をテーブル名の代わりに使用できます。
SELECT * は、CREATE VIEW 文のメインクエリでのみ使用できます。抽出テーブルとサブクエリは、* 演算子ではなく、SELECT リストの完全な式を使用する必要があります。たとえば、CREATE VIEW V AS SELECT * FROM T, (SELECT * FROM R) AS DT
は、抽出テーブル DT が指定された式による SELECT リストではなく SELECT * を使用しているため、正しくありません。同様に、抽出テーブルで暗黙の SELECT * を使用することはできません。たとえば、CREATE VIEW V AS SELECT * FROM T, LATERAL(proc(T.A.)) AS DT
には、LATERAL(proc(T.A.))
が LATERAL(SELECT * FROM proc(T.A.))
の省略形なので暗黙の SELECT * があるため、ビューの定義で使用できません。
ビューを定義する query-expression が GROUP BY 句、WINDOW 句、集合関数を含まないか、または集合演算子 (UNION、INTERSECT、EXCEPT) を伴わない場合は、ビューを更新できます。ビューを更新すると、基本となるテーブルも更新されます。
ビューのカラムには column-name リスト内で指定した名前が与えられます。column-name リストを指定しないと、ビューのカラムは SELECT リスト項目から名前が与えられます。SELECT リストのすべての項目がユニークな名前になるように指定します。SELECT リスト項目からの名前を使用するには、各項目を単純なカラム名にするか、エイリアス名を指定します。
SQL Anywhere では、query-expression の SELECT リスト内の名前のない式を、CREATE VIEW 文で参照できます。query-expression の SELECT リストの名前のない式には、名前 expression が割り当てられ、このような式が複数存在する場合、整数値と連結されます。たとえば、次の文は 3 つのカラム (expression、expression1、および expression2) を持つビュー V を定義し、これらの名前は作成されたビュー V の SYSCOLUMN システムビューに表示されます。
CREATE VIEW V AS SELECT DATEADD( DAY, 1, NOW() ), DATEADD( DAY, 2, NOW() ), DATEADD( DAY, 2, NOW() ) FROM SYS.DUMMY; |
名前のない SELECT リスト式を持つ他のビューにも同一の名前が割り当てられるため、これらの生成された名前に頼ることはおすすめしません。
一般的に、ビューはカタログに定義されているテーブルやビュー (およびその属性) を参照します。一方、ビューは SQL 変数も参照できます。この場合、ビューを参照するクエリが実行されると、SQL 変数の値が使用されます。SQL 変数を参照するビューは、変数がビューを実行するためのパラメーターとして機能することから、「パラメーター化されたビュー」と呼ばれます。
パラメーター化されたビューは、等価の SELECT ブロックの本体を FROM 句内の派生テーブルとしてクエリに埋め込む手段を提供します。パラメーター化されたビューは、ビューで参照されている SQL 変数を入力パラメーターとして取るようなストアドプロシージャーに埋め込まれたクエリで便利です。
CREATE VIEW 文が実行されるときに SQL 変数が存在している必要はありません。ただし、ビューを参照するクエリを実行するときに SQL 変数が定義されていないと、カラム (変数) が見つからないことを示すエラーが返されます。
ビュー定義内のテーブルに対する RESOURCE 権限と SELECT パーミッションが必要です。
オートコミット。
SQL/2008 CREATE VIEW は SQL/2008 標準のコア機能ですが、SELECT 文に組み込まれている一部のビュー機能はオプションの言語機能です。ビュー定義で最上位レベルの SELECT 文で ORDER BY 句を指定する機能は、オプションの SQL/2008 言語機能 F852 です。ビューの結果セットを SELECT TOP または LIMIT を使用して制限する機能は、オプションの SQL/2008 言語機能 F859 です (SQL/2008 標準では、この操作を行うために FETCH 句を使用します)。ビューの SELECT 文に、集合、DISTINCT が関係する派生テーブル、または集合演算子 (INTERSECT、EXCEPT、UNION) が含まれているなど、単純に更新できないビュー における WITH CHECK OPTION の指定は、オプションの SQL/2008 言語機能 T111 です。
CREATE VIEW の一部の機能は、ベンダー拡張です。パラメーター化されたビューは、オプションの OR REPLACE 構文や名前のない SELECT リスト式の名前の自動生成と同様に、ベンダー拡張です。
次の例は、男性従業員の情報のみを表示するビューを作成します。このビューはベーステーブルと同じカラム名を持ちます。
CREATE VIEW MaleEmployees AS SELECT * FROM Employees WHERE Sex = 'M'; |
次の例は、従業員と所属する部署を表示するビューを作成します。
CREATE VIEW EmployeesAndDepartments AS SELECT Surname, GivenName, DepartmentName FROM Employees JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID; |
次の例は、前の例で作成された EmployeesAndDepartments ビューを置き換えます。置き換え後のビューには、各従業員の住所の市、州、国が表示されます。
CREATE OR REPLACE VIEW EmployeesAndDepartments AS SELECT Surname, GivenName, City, State, Country FROM Employees JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID; |
次の例は、パラメーター化されたビューを変数 var1 と var2 に基づいて作成します。この 2 つはどちらも Employees テーブルまたは Departments テーブルの属性ではありません。
CREATE VIEW EmployeesByState AS SELECT Surname, GivenName, DepartmentName FROM Employees JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID WHERE Employees.State = var1 and Employees.Status = var2; |
変数は、変数が式として許可されている任意のコンテキストで、ビューの SELECT 文に出現させることができます。たとえば、次のパラメーター化されたビューでは、パラメーター var1 を LIKE 述部のパターンとして使用しています。
CREATE VIEW ProductsByDescription AS SELECT * FROM Products WHERE Products.Description LIKE var1; |
このビューを使用するには、ビューを参照するクエリの実行前に変数 var1 が定義されている必要があります。たとえば、次の BEGIN 文はプロシージャー、関数、またはバッチ文に使用できます。
BEGIN DECLARE var1 CHAR(20); SET var1 = '%cap%'; SELECT * FROM ProductsByDescription END |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |