【问题标题】:SQL Server VIEW results different to the SELECTSQL Server VIEW 结果与 SELECT 不同
【发布时间】:2013-02-11 21:33:50
【问题描述】:

我创建了以下简单视图:

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 行。

【问题讨论】:

  • 是否有可能在您从视图中选择数据之后,但在您从查询中选择之前添加了 1112 行?
  • 视图中的 Select 和 Select 直接依次运行了几次,结果相同。
  • 将它们放在一个事务中并在结果集上使用 DISTINCT 再次运行。我猜这个视图正在强制执行唯一性。
  • 为什么主表中的重复项会产生结果?我对 tdpur401100 表中的主键进行了计数,没有重复。
  • 一切都在cs 模式中吗?如果没有,是否有可能在 csdbo 架构之间重复某些表,从而查询不同的表?

标签: sql sql-server sql-server-2005 view


【解决方案1】:

如果从视图中选择和临时运行其定义之间确实存在差异,我会:

不过,在执行任何这些操作之前,看看执行计划、统计 io 等是否存在差异会很有趣。

【讨论】:

  • 我们计划在几天后重新启动,所以我会在此之后再次检查。
  • sp_refreshview 没有做任何事情吗?与往常一样,使用风险自负,但我会毫不犹豫地在生产机器上运行它(先尝试测试),尤其是在我得到错误数据的情况下。
  • 否 - 我删除了 VIEW 并重新创建了它。我认为这会产生更大的影响?
【解决方案2】:

要查看集合之间的差异,请尝试

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

【讨论】:

  • 我已从视图中识别出缺少的行,但我看不出有任何理由将它们从视图结果中排除。有什么我应该检查的吗?
  • 检查表 c 上的行数 - 它是否与视图或选择的行数匹配?
  • 表 c 的行数与视图或选择的行数不同。但那又怎样?
  • 当您查看缺少视图的 1112 行中的一些时,您是否注意到它们有什么特别之处,例如它们是重复的,或者它们是视图“应该”返回的行?我应该说检查“d inner join c”上的行数,这应该与您的“自行选择 stmt”计数相匹配。
  • 另外,您确定每次查询的来源都相同吗?您没有针对与视图所在的数据库不同的数据库运行 select 语句?
【解决方案3】:

SQL2008 实例也遇到了同样的问题。当我右键单击并将视图编写为创建脚本时,我可以清楚地看到视图定义中的硬编码值是“A”。但是,当我右键单击并选择前 1000 行时,没有返回硬代码。看起来,正在执行一组完全不同的代码。奇怪!挑战我所知道的关于数据库的一切。一定是 SQL Server 内部的一些奇怪的错误,或者尽管视图被修改了奇怪的数据缓存检索......没有 Windows 功能,没有涉及事务......我正在处理一组静态数据进行数据迁移,不是实时系统。

当我从视图中选择 TOP 1000 来合并视图定义时,我收到有关列定义不匹配的错误,因此显然有些东西不同步。

我重新编译了视图,问题就消失了。

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多