SQLServerでは複数のテーブルを結合した状態を1つのテーブルのように扱えるVIEWという機能があります。
VIEWを利用すると複雑なSELECT文を何度も書く必要がなくなり、メンテナンス性の向上に役立ちます。
また、VIEWは挿入または更新データが影響する結合元のテーブルが1の場合のみ、VIEWに対してINSERTやUPDATEを行うことができます。
SQLServerのVIEWに対するデータの挿入・更新
SQLServerのVIEWは複数のテーブルを結合した状態を1つのテーブルのように扱えるようにした仮想的なテーブルです。
このVIEWに対してデータの挿入や更新は、挿入、更新が与える影響されるテーブルが1つの場合のみ許されます。
VIEWの作り方
まずはVIEWの作り方ですが
で作成します。
実際のSQLでは
--VIEWの元テーブル1個め
CREATE TABLE table_a
(
no INT
,name VARCHAR(20)
)
--VIEWの元テーブル2個め
CREATE TABLE table_b
(
no INT
,age INT
)
GO
--VIEWの作成
CREATE VIEW table_all
AS
SELECT
tbl_a.no AS a_no
,tbl_b.no AS b_no
,tbl_a.name AS name
,tbl_b.age AS age
FROM
table_a AS tbl_a
,table_b AS tbl_b
WHERE
tbl_a.no = tbl_b.no
Go
[/SQL]
となります。
これに準備としてデータを挿入しておきます。
[sql]
INSERT INTO table_a VALUES ( 1, '太郎' ),( 2, '花子' ),( 3, '次郎' )
INSERT INTO table_b VALUES ( 1, 20 ),( 2, 18 ),( 3, 15 )
VIEWに対するSELECT(データの選択)
VIEWは通常のテーブルと同じようにあつかえるので、普通にSELECT文を書きます。
SELECT
a_no AS a_no
,b_no AS b_no
,name AS name
,age AS age
FROM
table_all
実行結果は
a_no b_no name age 1 1 太郎 20 2 2 花子 18 3 3 次郎 15
VIEWを使うと余計なテーブル結合(table join)などを書かずに済むのでSQLがスッキリします。
VIEWに対するデータのINSERT(挿入)、UPDATE(更新)
VIEWに対するデータのINSERT(挿入)、UPDATE(更新)はそのデータが与える影響が1つのテーブルに限定される場合のみ、許されます。
UPDATE table_all SET name = '名前変えました' WHERE a_no = 1
は影響するテーブルが「table_a」のみなので、これを実行しSELECTすると
a_no b_no name age 1 1 名前変えました 20 2 2 花子 18 3 3 次郎 15
となり正常に更新できています。
ただ
UPDATE table_all SET name = '名前変えました', age= 30 WHERE a_no = 1
のように「table_a」と「table_b」に影響するようなUPDATE文を実行すると
メッセージ 4405、レベル 16、状態 1、行 60 変更が複数のベース テーブルに影響するので、ビューまたは関数 'table_all' は更新可能ではありません。
とエラーになってしまいます。
まとめ
SQLServerでは複数のテーブルを結合した状態を1つのテーブルのように扱えるVIEWという機能があり、VIEWを使うと複雑なSELECT文を一度書くだけでそのSELECT結果自体をテーブルのように扱えます。
INSERTやUPDATEもそのデータが影響を与えるテーブルが1つの場合は通常のテーブルと同じようにINSERTやUPDATEが行えます。
- VIEWは複数のテーブルを結合して実行したSELECT文を登録し、テーブルのようにあつかえる機能
- VIEWに対するINSERTやUPDATEは影響するテーブルが1テーブルの時のみ可能
以上、SQLServerのVIEWに対するデータの挿入・更新でした。
