更新视图中的列

时间:2017-12-21 14:26:47

标签: sql sql-server

我设置了这个简单的视图,它连接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 个答案:

答案 0 :(得分:3)

当您从视图中选择ORIGREC = 114406时,EMIN是否有任何值,或者它是否为空?最有可能的是,ORIGREC 114406在左连接表中没有匹配的记录。您的更新语句有效地过滤了WHERE ORIGREC = 114406 AND PRODCODE.PRODCODE = EXPECTEDLEVELS.PRODCODE

只要受影响的列全部来自视图中的同一个表,您就可以定位左连接表。但是,如果左连接不会返回ORIGREC的EXPECTEDLEVELS行,则更新的行将为零,因为目标表中没有匹配的行。