54416


あるVIEW(a_b_view)の中で、「A番号」、「B番号」、「C番号」が共に同じレコードが存在することがあり、それらの中で「ステータス1」が”0”と”1”が混在している場合があります。

A,B,Cの同じ番号中でステータスが混在している場合のみ、この条件に合致する全てのVIEWのレコードに対して、「ステータス1」を”2"、「ステータス2」を”0”に更新するSQL文を作りたいのですが、上手くいきません。

ご教示をお願いできますでしょうか。

(例）「abc.a_b_view」（スキーマ"abc"、ビュー名"a_b_view"）  
項目名： A番号 , B番号, C番号 , ステータス1 , ステータス2

* * *
[code]

      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
      "A001"  "B001"   "C01"        0            1
    
[/code]

* * *
[code]

      "A002"  "B001"   "C01"        1            1
      "A002"  "B001"   "C01"        1            1
      "A002"  "B001"   "C01"        1            1
      "A002"  "B001"   "C01"        1            1
    
[/code]

* * *
[code]

      "A003"  "B002"   "C01"        1            1
      "A003"  "B002"   "C01"        1            1
      "A003"  "B002"   "C01"        0            1
      "A003"  "B002"   "C01"        1            1
      "A003"  "B002"   "C01"        1            1
      "A003"  "B002"   "C01"        0            1
      "A003"  "B002"   "C01"        1            1
      "A003"  "B002"   "C01"        1            1
      "A003"  "B002"   "C01"        0            1
    
[/code]

* * *

上記の内、「A003/B002/C01」の組合せグループが変更対象となります。  
この組み合わせグループのVIEWの全9レコードに対して、ステータス1を"2"に、ステータス2を"0"に変更したいのですが。。。

■試してみて上手く行かなかったSQL文

[code]

    update　　T
    set　　　　s_001 = 2 , s_002 = 0
    from　　　abc.a_b_view T , abc.a_b_view D
    where　　　T.t_001 = D.t_001
    and　　　　T.t_002 = D.t_002
    and　　　　T.t_003 = D.t_003
    and　　　　T.s_001 <> D.s_001;
    
[/code]

・その時のエラー内容

メッセージ 4405、レベル 16、状態 1、行 1  
変更が複数のベース テーブルに影響するので、ビューまたは関数 'T' は更新可能ではありません。

* * *

■テーブルとVIEWを作成した時のクエリ文

[code]

    CREATE　TABLE　a_tbl
    (
    　t_001　NVARCHAR(6)　DEFAULT　NULL,　　　　/* A番号 */
    　t_002　NVARCHAR(6)　DEFAULT　NULL,　　　　/* B番号 */
    　t_003　NVARCHAR(6)　DEFAULT　NULL,　　　　/* C番号 */
    　s_001　NUMERIC(1)　　DEFAULT　0　　　　　/* ステータス1 */
    )
    
    CREATE　TABLE　b_tbl
    (
    　t_001　NVARCHAR(6)　DEFAULT　NULL,　　　　/* A番号 */
    　t_002　NVARCHAR(6)　DEFAULT　NULL,　　　　/* B番号 */
    　t_003　NVARCHAR(6)　DEFAULT　NULL,　　　　/* C番号 */
    　s_002　NUMERIC(1)　　DEFAULT　0　　　　　/* ステータス2 */
    )
    
    CREATE　VIEW　a_b_view( t_001,t_002,t_003,s_001,s_002 )
    AS
    SELECT　　a.t_001,            
    　　　　　　a.t_002,
    　　　　　　a.t_003,
    　　　　　　a.s_001,
    　　　　　　b.s_002
    FROM　　　a_tbl a , b_tbl b
    WHERE　　a.t_001 = b.t_001
    
[/code]

RDBMSは「SQL Server 2016」です。  
どうぞよろしくお願いいたします。


CC BY-SA 4.0
2019-04-23T06:05:46.217
54415
2019-04-23T07:05:40.910
2019-04-23T07:05:40.910
2238
16778
question
sql sql-server
VIEWの中で同じ番号を持つグループの中で、ステータスが混在している場合だけ、VIEWの値を更新するSQL文を作成したい


一般にビューは更新不可能であり、基になるテーブルを更新する必要があります。

なお、SQL Serverには[更新可能なビュー](https://docs.microsoft.com/ja-
jp/sql/t-sql/statements/create-view-transact-sql?view=sql-
server-2017#updatable-views)という機能がありますが、

> UPDATE、INSERT、DELETE ステートメントなどの変更で、1 つのベース テーブルのみの列を参照している。

という条件を満たしていないので`a_b_view`については更新できません。`a_tbl`および`b_tbl`を更新してください。

* * *

蛇足ですが、[`NUMERIC(1)`は５バイト](https://docs.microsoft.com/ja-jp/sql/t-sql/data-
types/decimal-and-numeric-transact-sql?view=sql-
server-2016)です。`0`と`1`しか格納しないのであれば[`bit`](https://docs.microsoft.com/ja-
jp/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017)をお勧めします。


CC BY-SA 4.0
2019-04-23T06:23:31.483
54416
2019-04-23T06:54:36.263
2019-04-23T06:54:36.263
4236
4236
54415
answer