2017-12-21 11 views
1

3つの異なるテーブルを結合し、プログラム内にデータを表示する、この単純なビューを適切に設定しました。しかし、テーブルPRODCODEの列を次のように更新できることに気付きました。ビュー内の列の更新

update PRODCODE_VW set MAXGH = 5.00 where ORIGREC = 114406 --RETURNS 1 UPDATED 

そして1レコードが更新されます。しかし、ExpectedLevelsの更新を行うと、0行が更新されます。私はそれが残っているので、これは仮定しています。更新ステートメントではなくビューの設定方法を変更するだけで、これを回避する方法はありますか?

update PRODCODE_VW set EMIN = 5.00 where ORIGREC = 114406 --RETURNS 0 UPDATED 

これは私が所定の位置に設定した図である。

IF EXISTS (SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.VIEWS 
     WHERE TABLE_NAME = N'PRODCODE_vw') 
    DROP VIEW PRODCODE_vw 
GO 

CREATE VIEW dbo.PRODCODE_vw 
AS 
SELECT PRODCODE.STUFF,PRODCODE.ORIGREC,PRODCODE.PRODCODE,PRODCODE.PRODNAM, 
C1JMASTER.C1JTYPE, EXPECTEDLEVELS.EMIN, EXPECTEDLEVELS.EMAX 
FROM PRODCODE (NOLOCK) 
    LEFT JOIN C1JMASTER (NOLOCK) 
    ON PRODCODE.c1jcode = C1JMASTER.c1jcode 
    LEFT JOIN EXPECTEDLEVELS 
    ON PRODCODE.PRODCODE = EXPECTEDLEVELS.PRODCODE 

GO 
+1

あなたは本当にNoLockを避けるべきです。これは不適切な名前が付けられており、SQL Serverに他のトランザクションによって保持されている既存のロックを無視するように指示します。つまり、コミットされていないデータを読み取る可能性があります。 NoLockヒントを含むクエリでは、データの取得に必要なオブジェクトのロックが要求されます。 –

答えて

3

ビューからORIGREC = 114406を選択すると、EMINのための任意の値が存在するか、それがnullでありますか?ほとんどの場合、ORIGREC 114406には、左の結合テーブルに一致するレコードがありません。更新ステートメントは効果的にフィルタリングされますWHERE ORIGREC = 114406 AND PRODCODE.PRODCODE = EXPECTEDLEVELS.PRODCODE

影響を受ける列がすべてビュー内の同じテーブルから供給されている限り、左側の結合テーブルを対象にできます。ただし、左結合でORIGRECのEXPECTEDLEVELS行が戻されない場合は、ターゲット表に一致する行がないため、更新された行はゼロになります。

関連する問題