表表達式
如果只需要單個查詢的視圖定義
可使用表表達式
表表達式是臨時的
只在 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 的結果集
與嵌套表表達式示例中產生的結果相同
(
)最後
我們獲得能產生期望結果的實際查詢
連接這兩個表(PAYLEVEL
PAYBYED)以確定總收入比同年雇用的人的平均收入低的那些人
注意
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
結果如下
educity
cn/img_
/
/
/
jpg >
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22104.html