表表达式
如果只需要单个查询的视图定义可使用表表达式
表表达式是临时的只在 SQL 语句的使用期限内有效表表达式不能共享但它们比视图更灵活任何授权的用户都可共享视图定义
本节描述如何在查询中使用公共表表达式和嵌套表表达式
公共表表达式
公共表表达式是在全查询的开头使用 WITH 关键字定义的命名结果表公共表表达式是您创建以在复杂查询之中使用的表表达式在查询的开头使用 WITH 子句定义并命名公共表表达式对公共表表达式的重复引用使用同一个结果集相比之下如果使用嵌套表表达式或视图则每次都将重新生成结果集其结果可能各不相同
下列示例列出公司中教育级别大于 平均工资比那些同时雇用的且有同样教育级别的人低的所有人在该查询后面会更详细地描述查询的各个部分
()
WITH
PAYLEVEL AS
(SELECT EMPNO YEAR(HIREDATE) AS HIREYEAR EDLEVEL
SALARY+BONUS+COMM AS TOTAL_PAY
FROM EMPLOYEE
WHERE EDLEVEL > )
()
PAYBYED (EDUC_LEVEL YEAR_OF_HIRE AVG_TOTAL_PAY) AS
(SELECT EDLEVEL HIREYEAR AVG(TOTAL_PAY)
FROM PAYLEVEL
GROUP BY EDLEVEL HIREYEAR)
()
SELECT EMPNO EDLEVEL YEAR_OF_HIRE TOTAL_PAY DECIMAL(AVG_TOTAL_PAY)
FROM PAYLEVEL PAYBYED
WHERE EDLEVEL=EDUC_LEVEL
AND HIREYEAR = YEAR_OF_HIRE
AND TOTAL_PAY < AVG_TOTAL_PAY
()这是名为 PAYLEVEL 的公共表表达式此结果表包括雇用某个人的年份该雇员的总收入以及他(或她)的教育级别只包括雇员的教育级别大于 的那些行
()这是名为 PAYBYED(或 PAY by education)的公共表表达式该表达式使用在前一个公共表表达式中创建的 PAYLEVEL 表来确定每个教育级别同一年雇用的雇员的教育级别雇用年份以及平均收入此表返回的列被赋予的名称与选择列表中所使用的列名不同(如 EDUC_LEVEL)这会生成命名为 PAYBYED 的结果集与嵌套表表达式示例中产生的结果相同
()最后我们获得能产生期望结果的实际查询连接这两个表(PAYLEVELPAYBYED)以确定总收入比同年雇用的人的平均收入低的那些人注意PAYBYED 是以 PAYLEVEL 为基础所以在完整语句中有效地存取了 PAYLEVEL 两次两次都使用同一组行来计算查询
最终结果如下
嵌套表表达式
嵌套表表达式是一个临时视图其中的定义被嵌套(直接定义)在主查询的 FROM子 句中
下列查询使用嵌套表表达式来寻找那些教育级别超过 的雇员的平均总收入教育级别以及雇用年份
SELECT EDLEVEL HIREYEAR DECIMAL(AVG(TOTAL_PAY) )
FROM (SELECT YEAR(HIREDATE) AS HIREYEAR EDLEVEL
SALARY+BONUS+COMM AS TOTAL_PAY
FROM EMPLOYEE
WHERE EDLEVEL > )AS PAY_LEVEL
GROUP BY EDLEVEL HIREYEAR
ORDER BY EDLEVEL HIREYEAR
结果如下
educitycn/img_///jpg >