子查询中的数据不被识别为数字?

时间:2015-07-28 11:34:56

标签: sql-server

我已经根据我在工作中使用的应用程序生成的几个表创建了一个View。生成View的SQL包含许多CASE WHEN表达式,因为原始表缺少我运行的报告所需的一些逻辑。

我做的一件事是,当一个Item在表之间不匹配时,我希望某些列中有0个值。

round(case when e.Item=p.Item then p.ColumnA else 0 end,6) as NewColumnA

ColumnA的数据类型为FLOAT,看起来NewColumA也是FLOAT。但是当我在View上运行查询并指定我不想要NewColumnA为零的记录时,它运行得非常慢。但是,如果我在VIEW中的CASE WHEN之外添加一个ROUND,它的运行速度要快得多(80s vs 0.5s)。

{{1}}

现在,这解决了我的性能问题,但我认为这不是解决它的“最佳实践”方式。我也非常有兴趣了解问题所在。

1 个答案:

答案 0 :(得分:0)

对视图中的计算值使用查询会降低查询速度,因为它需要在视图中进行所有计算才能进行比较。

在您的视图中将e.Item和p.Item包含在不同的别名下,在本演示中我使用了e_item和p_item。

将此应用于WHERE子句,并且不要在WHERE子句中包含NewColumnA:

WHERE
  exists(SELECT e_item EXCEPT SELECT p_item) 

使用上面的语法来防止NULL值给出错误的结果。

如果您的列永远不会包含null,则只需使用

即可
WHERE
  e_item <> p_item