我创建了以下简单视图:
CREATE VIEW cs.MyTestPO AS
SELECT ttdpur401100.t_orno
, ttdpur401100.t_item
, ttcibd001100.t_dsca
FROM ttdpur401100
JOIN ttcibd001100 ON ttcibd001100.t_item = ttdpur401100.t_item
然后SELECT * FROM cs.MyTestPO
返回276376行
如果我自己运行select语句
SELECT ttdpur401100.t_orno
, ttdpur401100.t_item
, ttcibd001100.t_dsca
FROM ttdpur401100
JOIN ttcibd001100 ON ttcibd001100.t_item = ttdpur401100.t_item
它返回277488行
任何人都可以建议为什么视图缺少SELECT语句返回的1112行。
答案 0 :(得分:5)
如果从视图中选择和ad-hoc运行其定义之间确实存在差异,我会:
在执行任何此操作之前,查看执行计划,统计信息等是否存在差异会很有趣。
答案 1 :(得分:1)
要查看各组之间的差异,请尝试
SELECT d
d.t_orno , d.t_item , c.t_dsca
FROM ttdpur401100 d
inner JOIN ttcibd001100 c ON
c.t_item = d.t_item left outer join
cs.MyTestPO t on d.t_item = t.t_item
where
t.t_item is null
答案 2 :(得分:0)
对SQL2008实例遇到了同样的问题。当我右键单击并编写我的视图(作为创建)时,我可以清楚地在视图定义中看到硬编码值为“A”。但是,当我右键单击并选择前1000行时,硬代码未被返回。看起来,正在执行一组完全不同的代码。离奇!蔑视我所知道的关于数据库的一切。必须是SQL Server内容中的一些奇怪的错误,或者奇怪的数据缓存检索,尽管视图被修改...没有Windows函数,没有涉及事务......我正在针对数据迁移的静态数据集,不是现场系统。
当我使用视图中的选择TOP 1000对视图定义进行UNION时,我收到有关列定义不匹配的错误,因此显然有些内容不同步。
我重新编译了视图,问题就消失了。