DB2公共表表达式属于临时表,下面就为您详细介绍DB2公共表表达式的使用方法,希望可以让您对DB2公共表表达式有更深的认识。
DB2使用公共表表达式
DB2公共表表达式是一个本地临时表,可以在一条 SQL 语句中引用多次。这个临时表只能存在于定义它的 SQL 语句的生命周期内。每次公共表表达式被引用时,其结果都是相同的。临时表是在 SQL 语句中用 WITH 子句定义的。下面是具体的语法:
WITH <COMMON NAME1> AS ( <SELECT EXPRESSION>), <COMMON NAME2>
AS (<SELECT EXPRESSION), & SELECT <COLUMN> FROM <TABLE_NAME> <WHERE_CLAUSE>
<table_name> 是数据库中的一个表,也可以是由一个包括 WITH 子句的 SQL 语句定义的 <Common name>。 下面是一个例子:
class="dp-xml">
- 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 被定义为一个公共表表达式。它与一个名为 totals 的公共表表达式一起使用。最终的 SELECT 语句将从两个公共表表达式中进行选择。
下面看另一个例子:
- 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
这个公共表表达式包含了 PAYLEVEL。这个结果表包括员工编号、该员工被雇年份、该员工的总工资以及该员工的受教育程度。只需要包括受教育程度大于 16 的那些员工的记录。
该列表还包括一个名为 PAYBYED(“pay by education” 的缩写)的公共表表达式。它通过使用 PAYLEVEL 表来确定受教育程度、被雇年份和同年被雇的具有同等受教育程度的员工的平均工资。由这个表中得到的列的列名(例如 EDUC_LEVEL)与选择列表中使用的列名不同。
最后,我们得到能够产生所需结果的实际查询。该查询连接两个表(PAYLEVEL、PAYBYED),确定工资低于同年雇用的所有员工平均工资的员工。注意,PAYBYED 是基于 PAYLEVEL 的,所以在整个语句中,PAYLEVEL 实际上被访问了两次。在这两次中,计算查询时都用到了同一组行。
在定义一个公共表表达式之后,就可以像使用其他表一样 SQL 语句中使用它。可以任意次地使用公共表表达式。甚至可以在之前创建的公共表表达式的基础上,再创建一个公共表表达式。