DB2公共表表達(dá)式的用法
DB2公共表表達(dá)式屬于臨時(shí)表,下面就為您詳細(xì)介紹DB2公共表表達(dá)式的使用方法,希望可以讓您對(duì)DB2公共表表達(dá)式有更深的認(rèn)識(shí)。
DB2使用公共表表達(dá)式
DB2公共表表達(dá)式是一個(gè)本地臨時(shí)表,可以在一條 SQL 語句中引用多次。這個(gè)臨時(shí)表只能存在于定義它的 SQL 語句的生命周期內(nèi)。每次公共表表達(dá)式被引用時(shí),其結(jié)果都是相同的。臨時(shí)表是在 SQL 語句中用 WITH 子句定義的。下面是具體的語法:
WITH <COMMON NAME1> AS ( <SELECT EXPRESSION>), <COMMON NAME2>
AS (<SELECT EXPRESSION), & SELECT <COLUMN> FROM <TABLE_NAME> <WHERE_CLAUSE>
<table_name> 是數(shù)據(jù)庫中的一個(gè)表,也可以是由一個(gè)包括 WITH 子句的 SQL 語句定義的 <Common name>。 下面是一個(gè)例子:
- WITH PROD_QUANTITY AS
- (SELECT PRODUCT_ID, SUM (QUANTITY) AS QUANTITY
- FROM CUSTOMER_ORDER_ITEM
- GROUP BY PRODUCT_ID),
- TOTALS AS
- (SELECT -1 AS PRODUCT_ID, SUM(QUANTITY) AS TOTAL)
- SELECT PRODUCT_ID, QUANTITY
- FROM PROD_QUANTITY
- UNION
- SELECT PRODUCT_ID, TOTALS
- FROM TOTALS
- ORDER BY 1 DESC
在上述例子中,prod_quantity 被定義為一個(gè)公共表表達(dá)式。它與一個(gè)名為 totals 的公共表表達(dá)式一起使用。最終的 SELECT 語句將從兩個(gè)公共表表達(dá)式中進(jìn)行選擇。
下面看另一個(gè)例子:
- WITH
- PAYLEVEL AS
- (SELECT EMPNO, EDLEVEL, YEAR(HIREDATE) AS HIREYEAR,
- SALARY+BONUS+COMM AS TOTAL_PAY
- FROM EMPLOYEE
- WHERE EDLEVEL > 16),
- 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,7,2)
- FROM PAYLEVEL, PAYBYED
- WHERE EDLEVEL = EDUC_LEVEL
- AND HIREYEAR= YEAR_OF_HIRE
- AND TOTAL_PAY < AVG_TOTAL_PAY
這個(gè)公共表表達(dá)式包含了 PAYLEVEL。這個(gè)結(jié)果表包括員工編號(hào)、該員工被雇年份、該員工的總工資以及該員工的受教育程度。只需要包括受教育程度大于 16 的那些員工的記錄。
該列表還包括一個(gè)名為 PAYBYED(“pay by education” 的縮寫)的公共表表達(dá)式。它通過使用 PAYLEVEL 表來確定受教育程度、被雇年份和同年被雇的具有同等受教育程度的員工的平均工資。由這個(gè)表中得到的列的列名(例如 EDUC_LEVEL)與選擇列表中使用的列名不同。
最后,我們得到能夠產(chǎn)生所需結(jié)果的實(shí)際查詢。該查詢連接兩個(gè)表(PAYLEVEL、PAYBYED),確定工資低于同年雇用的所有員工平均工資的員工。注意,PAYBYED 是基于 PAYLEVEL 的,所以在整個(gè)語句中,PAYLEVEL 實(shí)際上被訪問了兩次。在這兩次中,計(jì)算查詢時(shí)都用到了同一組行。
在定義一個(gè)公共表表達(dá)式之后,就可以像使用其他表一樣 SQL 語句中使用它??梢匀我獯蔚厥褂霉脖肀磉_(dá)式。甚至可以在之前創(chuàng)建的公共表表達(dá)式的基礎(chǔ)上,再創(chuàng)建一個(gè)公共表表達(dá)式。
【編輯推薦】