sql - SELECT 的行为变化
问题描述
我正在将 SQL Server 2008 数据库迁移到 SQL Server 2019,我使用 Microsoft 数据迁移助手来查找搜索任何行为更改、问题或语法错误。
我有一个 SELECT,它给了我进行迁移的兼容性错误:
对象使用旧式连接语法,在数据库兼容级别 90 或更高时性能较差。
这是我认为会出错的 SELECT:
SELECT
@Pro = CEILING((BaseDev * 100) / (ISNULL(BaseExe, 0) + ISNULL(BaseDev, 0)))
FROM
(SELECT SUM(Base) 'BaseDev'
FROM Table1
WHERE Con = @Con AND Lib <> 0 AND Tip = 1
AND Fac = 'V' AND ISNULL(Pct, 0) <> 0) A,
(SELECT SUM(Base) 'BaseExe'
FROM Table1
WHERE Con = @Con AND Lib <> 0 AND Tip = 1 AND Fac = 'V'
AND ISNULL(Pct, 0) = 0) B
解决方案
您可以完全摆脱JOIN
并使用条件聚合:
WITH CTE AS(
SELECT SUM(CASE WHEN Pct <> 0 THEN Base END) AS BaseDev,
SUM(CASE WHEN Pct = 0 OR Pct IS NULL THEN Base END) AS BaseExe
FROM dbo.Table1
WHERE Con = @Con
AND Lib <> 0
AND Tip = 1
AND Fac = 'V')
SELECT @Pro = CEILING((BaseDev * 100) / (ISNULL(BaseExe, 0) + ISNULL(BaseDev, 0)))
FROM CTE;
这也应该更高效,因为它会导致对表进行一次扫描/查找。
推荐阅读
- wordpress - “volumes”如何用 docker-compose 覆盖 docker 镜像的原始文件?
- javascript - 错误:ER_NO_DB_ERROR:没有选择数据库 NODEJS MYSQL
- sql - 如何在 oracle SQL 中将表中的日期从 16-04-06 转换为 06-APR-16?
- go - 解组复杂的json数据结构
- vb.net - 多个文件组合的 WebClient AsyncCompleted 事件
- amazon-ec2 - Windows EC2 具有 FHD (1920x1080) 分辨率
- racket - 从 SML 转换为球拍的插入语句不起作用
- webpack - Symfony 5 和 sudo commad 使用 Windows 10
- html - CSS flex-direction:列,证明没有发生定位
- node.js - 如何使用 updateOne() 检查文档是否已更新 [mongoose,React,Node js, Mongodb]