代码如下:
问题是:with句中的子查询返回的临时表名,可以应用于全局。但是,from句中的子查询,返回的临时表明,却在用于where句的子查询中的时候,sql server提示 临时表明无效? 问题总结为from 句中的子查询的临时表名的作用域范围为多少?
WITH T2 ( department, avg_salary ) --这样是可以正确执行的
AS
( SELECT department,
AVG(salary)
FROM teacher
GROUP BY department
)
SELECT department --找出平均工资最高的系的系名
FROM T2
WHERE T2.avg_salary=(SELECT MAX(avg_salary)
FROM T2; )
SELECT department --这样会提示T2识别不了
FROM (SELECT department,AVG(salary) AS avg_salary
FROM teacher
GROUP BY department
) AS T2(department,avg_salary)
WHERE avg_salary=(SELECT MAX(avg_salary)
FROM T2 --这里的T2无效,为什么? 如果把上面from中的子查询放在with语句中,T2就有效
)
SELECT department --这样可以,不使用from子句返回的临时表名T2
FROM ( SELECT department,
AVG(salary) AS avg_salary
FROM teacher
GROUP BY department
) AS T2 ( department, avg_salary )
WHERE avg_salary = ( SELECT MAX(salary)
FROM ( SELECT AVG(salary) AS salary
FROM teacher
GROUP BY department
) AS T1 --sql server中 from句后的嵌套子查询必须取个临时表名,否则报错
)