我正在处理一些在我开始工作之前创建的报告。其中一个报告基于视图(SQL Server 2005)。
这个视图非常大而且笨重,而且现在,我不会发布它,因为我觉得它太大了。我不确定它是如何产生的 - 我猜它是由设计师制作的,因为我看不到有人在写这样的东西。它有几页长,并引用了其他5个视图。底线 - 它很复杂,需要重构/重新设计,但在我们有时间之前我们会坚持下去。
无论如何,我必须对它进行一些小的非功能性更改才能将其移动到不同的数据库和模式。为了确保我没有改变实际返回的内容,我正在修改视图的第二个版本。让我们调用第一个视图vw_Data1和我的新视图vw_Data2。现在,如果我写:
SELECT Count(*) FROM
(
SELECT * FROM vw_Data1
UNION
SELECT * FROM vw_Data2
)
然后我应该回到与我刚做的相同的数字
SELECT Count(*) FROM vw_Data1
只要vw_Data1和vw_Data2返回相同的行(这是我要检查的内容)。
然而,我发现的是如果我多次运行UNION查询,我每次都会得到不同的结果。
所以,只是要清楚,如果我跑:
SELECT Count(*) FROM
(
SELECT * FROM vw_Data1
UNION
SELECT * FROM vw_Data2
)
不止一次,每次都会得到不同的结果。
正如我所说,我还没有发布实际的代码,因为我想问的第一件事就是这样 - 查询返回不同的结果怎么样呢?
使用了一个非确定性函数,这是以下(可怕)连接的一部分:
LEFT OUTER JOIN dbo.vwuniversalreportingdata_budget
ON
CASE
WHEN dbo.f_tasks.ta_category = 'Reactive' THEN
CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10))
+ ' | '
+ CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10))
+ ' | '
+ CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_sched_date)) AS VARCHAR(10))
WHEN dbo.f_tasks.ta_category = 'Planned' THEN
CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10))
+ ' | '
+ CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10))
+ ' | '
+ CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_est_date)) AS VARCHAR(10))
WHEN dbo.f_tasks.ta_category = 'Periodic' THEN
CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10))
+ ' | '
+ CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10))
+ ' | '
+ CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_est_date)) AS VARCHAR(10))
END
= dbo.vwuniversalreportingdata_budget.id
整个查询非常恶心。无论如何,任何关于如何发生这种情况的想法都会感激不尽。这可能与工会有关吗?我不知道。救命啊!