gpt4 book ai didi

sql-server - 子查询中的数据未被识别为数字?

转载 作者:行者123 更新时间:2023-12-04 19:53:37 25 4
gpt4 key购买 nike

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

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

case when e.Item=p.Item then p.ColumnA else 0 end as NewColumnA

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

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

现在,这解决了我的性能问题,但我认为这几乎不是解决它的“最佳实践”方法。我也非常想知道问题出在哪里。

最佳答案

在 View 中对计算值使用查询会减慢您的查询速度,因为它需要在 View 中进行所有计算才能进行比较。

在您的 View 中以不同的别名包含 e.Item 和 p.Item,在此演示中我使用 e_item 和 p_item。

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

WHERE
exists(SELECT e_item EXCEPT SELECT p_item)

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

如果您的列从不包含空值,您可以简单地使用

WHERE
e_item <> p_item

关于sql-server - 子查询中的数据未被识别为数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31675139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com