我设置了这个简单的视图,它连接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
答案 0 :(得分:3)
当您从视图中选择ORIGREC = 114406时,EMIN是否有任何值,或者它是否为空?最有可能的是,ORIGREC 114406在左连接表中没有匹配的记录。您的更新语句有效地过滤了WHERE ORIGREC = 114406 AND PRODCODE.PRODCODE = EXPECTEDLEVELS.PRODCODE
只要受影响的列全部来自视图中的同一个表,您就可以定位左连接表。但是,如果左连接不会返回ORIGREC的EXPECTEDLEVELS行,则更新的行将为零,因为目标表中没有匹配的行。