Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用windows函数和子查询比较sql查询的效率_Sql_Sql Server_Query Optimization - Fatal编程技术网

使用windows函数和子查询比较sql查询的效率

使用windows函数和子查询比较sql查询的效率,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我想了解我的查询是否正确,以及它是否比第一次查询有效 编写一个查询以显示员工id、名字和姓氏、SalaryDrawed、AvgCompare(工资-所有员工的平均工资)和SalaryStatus列,其中,对于那些工资高于和低于所有员工平均工资的员工,标题分别为HIGH和LOW 示例员工表: 员工|姓名|姓氏|工资|经理|部门| ID| 第一个问题 SELECT employee_id, first_name, last_name, salary AS SalaryDrawn, ROUN

我想了解我的查询是否正确,以及它是否比第一次查询有效

编写一个查询以显示员工id、名字和姓氏、SalaryDrawed、AvgCompare(工资-所有员工的平均工资)和SalaryStatus列,其中,对于那些工资高于和低于所有员工平均工资的员工,标题分别为HIGH和LOW

示例员工表:

员工|姓名|姓氏|工资|经理|部门| ID|

第一个问题

SELECT  employee_id,  first_name, last_name,  salary AS SalaryDrawn,  
ROUND((salary -(SELECT AVG(salary) FROM employees)),2) AS AvgCompare,  
CASE  WHEN salary >= 
(SELECT AVG(salary) 
FROM employees) THEN 'HIGH'  
ELSE 'LOW'  
END AS SalaryStatus 
FROM employees;
使用CTE和windows功能的我的答案:

WITH cte AS 
(SELECT  employee_id,  first_name, last_name,  salary,
ROUND(AVG(Salary) OVER (),2) AS avgSal 
FROM employees)

Select employee_id, first_name, last_name, salary, ROUND((e.salary - avgSal ,2) AS AvgCompare,  
CASE  WHEN salary >= avgSal THEN 'HIGH'  
ELSE 'LOW'  
END AS SalaryStatus 
FROM cte
我想知道我的问题是否正确

创建一些示例数据和预期结果。运行查询并进行比较

如果它比第一次查询有效呢

看一看资源的使用情况


是查看查询资源利用率的简单方法。

看起来正确。是的,更多efficient@Charlieface你介意解释一下原因吗?这是因为在第一个查询中,子查询将为每一行计算,这就是为什么第二个查询更高效的原因吗?我不一定说它将为每一行计算,但通常是这样。但编译器通常会将其排列为假脱机,并保存预先计算的值。但是你仍然需要扫描表3次而不是一次。