DB2公共表表达式的用法


  本文标签:DB2公共表表达式

  DB2公共表表达式属于临时表,下面就为您详细介绍DB2公共表表达式的使用方法,希望可以让您对DB2公共表表达式有更深的认识  。

  DB2使用公共表表达式

  DB2公共表表达式是一个本地临时表,可以在一条 SQL 语句中引用多次  。这个临时表只能存在于定义它的 SQL 语句的生命周期内  。每次公共表表达式被引用时,其结果都是相同的  。临时表是在 SQL 语句中用 WITH 子句定义的  。下面是具体的语法:

  WITH AS ( FROM
 
是数据库中的一个表,也可以是由一个包括 WITH 子句的 SQL 语句定义的   。 下面是一个例子:

  1. WITH PROD_QUANTITY AS  
  2.  
  3. (SELECT PRODUCT_ID, SUM (QUANTITY) AS QUANTITY  
  4.  
  5.     FROM CUSTOMER_ORDER_ITEM  
  6.  
  7.     GROUP BY PRODUCT_ID),  
  8.  
  9.  
  10. TOTALS AS  
  11.  
  12. (SELECT -1 AS PRODUCT_ID, SUM(QUANTITY) AS TOTAL)  
  13.  
  14.  
  15. SELECT PRODUCT_ID, QUANTITY   
  16.  
  17. FROM PROD_QUANTITY  
  18.  
  19. UNION  
  20.  
  21. SELECT PRODUCT_ID, TOTALS  
  22.  
  23. FROM TOTALS  
  24.  
  25. ORDER BY 1 DESC  

  在上述例子中,prod_quantity 被定义为一个公共表表达式  。它与一个名为 totals 的公共表表达式一起使用  。最终的 SELECT 语句将从两个公共表表达式中进行选择  。

  下面看另一个例子:

  1. WITH  
  2.  
  3. PAYLEVEL AS                                                   
  4.  
  5.     (SELECT EMPNO, EDLEVEL, YEAR(HIREDATE) AS HIREYEAR,             
  6.  
  7.         SALARY+BONUS+COMM AS TOTAL_PAY                                       
  8.  
  9.         FROM EMPLOYEE                                                           
  10.  
  11.         WHERE EDLEVEL > 16),                                                         
  12.  
  13.  
  14. PAYBYED (EDUC_LEVEL, YEAR_OF_HIRE, AVG_TOTAL_PAY) AS           
  15.  
  16.     (SELECT EDLEVEL, HIREYEAR, AVG(TOTAL_PAY)                    
  17.  
  18.          FROM PAYLEVEL                                              
  19.  
  20.          GROUP BY EDLEVEL, HIREYEAR)  
  21.  
  22.  
  23. SELECT EMPNO, EDLEVEL, YEAR_OF_HIRE, TOTAL_PAY, DECIMAL(AVG_TOTAL_PAY,7,2)  
  24.  
  25.     FROM PAYLEVEL, PAYBYED                                               
  26.  
  27.     WHERE EDLEVEL = EDUC_LEVEL                                          
  28.  
  29.         AND HIREYEARYEAR_OF_HIRE                                
  30.  
  31.         AND TOTAL_PAY < AVG_TOTAL_PAY       

  这个公共表表达式包含了 PAYLEVEL  。这个结果表包括员工编号、该员工被雇年份、该员工的总工资以及该员工的受教育程度  。只需要包括受教育程度大于 16 的那些员工的记录  。

  该列表还包括一个名为 PAYBYED(“pay by education” 的缩写)的公共表表达式  。它通过使用 PAYLEVEL 表来确定受教育程度、被雇年份和同年被雇的具有同等受教育程度的员工的平均工资  。由这个表中得到的列的列名(例如 EDUC_LEVEL)与选择列表中使用的列名不同  。

  最后,我们得到能够产生所需结果的实际查询  。该查询连接两个表(PAYLEVEL、PAYBYED),确定工资低于同年雇用的所有员工平均工资的员工  。注意,PAYBYED 是基于 PAYLEVEL 的,所以在整个语句中,PAYLEVEL 实际上被访问了两次  。在这两次中,计算查询时都用到了同一组行  。

  在定义一个公共表表达式之后,就可以像使用其他表一样 SQL 语句中使用它  。可以任意次地使用公共表表达式  。甚至可以在之前创建的公共表表达式的基础上,再创建一个公共表表达式  。