db2构建临时结果集

Posted 有的事,必须自己去领悟~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了db2构建临时结果集相关的知识,希望对你有一定的参考价值。

values  (‘1‘,2,3)   为一行   ‘1’   2    3   行数据类型可以不同  values  (‘1‘,2,3),(‘f‘,5,6) 为两行

(values  1,2,3)   为一列 

1

2

3

所以数据类型必须一样,不然报错

二  with做临时表,with还可以递归查询

二.1 with可以和select语句组合做临时表

CREATE TABLE USER  
(  
NAME VARCHAR(20) NOT NULL,--姓名  
DEGREE INTEGER NOT NULL,--学历(1、专科 2、本科 3、硕士 4、博士)  
STARTWORKDATE date NOT NULL,--入职时间  
SALARY1 FLOAT NOT NULL,--基本工资  
SALARY2 FLOAT NOT NULL--奖金  
); 

假设现在让你查询一下那些 1、学历是硕士或博士  2、学历相同,入职年份也相同,但是工资(基本工资+奖金)却比相同条件员工的平均工资低的员工。(哈哈,可能是要涨工资),不知道你听明白问题没有?该怎么查询呢?

对比两种方式:

a

WITH TEMP1(NAME,DEGREE,WORDDATE,SALARY) AS   
(  
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)  
),  
TEMP2 (DEGREE,WORDDATE,AVG_SALARY) AS  
(  
SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY   
FROM USER WHERE DEGREE IN (3,4)  
GROUP BY DEGREE,YEAR(STARTWORKDATE)  
)  
SELECT NAME FROM TEMP1, TEMP2 WHERE   
TEMP1.DEGREE=TEMP2.DEGREE   
AND TEMP1.WORDDATE=TEMP2.WORDDATE   
AND SALARY<AVG_SALARY;  

b

WITH TEMP1(NAME,DEGREE,WORDDATE,SALARY) AS   
(  
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)  
),  
TEMP2 (DEGREE,WORDDATE,AVG_SALARY) AS  
(  
SELECT DEGREE,WORDDATE, AVG(SALARY) AS AVG_SALARY   
FROM TEMP1  
GROUP BY DEGREE,WORDDATE  
)  
SELECT NAME FROM TEMP1, TEMP2 WHERE   
TEMP1.DEGREE=TEMP2.DEGREE   
AND TEMP1.WORDDATE=TEMP2.WORDDATE   
AND SALARY<AVG_SALARY;  

递归用法:

论坛首页  
--数据库开发  
----DB2  
------DB2 文章1  
--------DB2 文章1 的评论1  
--------DB2 文章1 的评论2  
------DB2 文章2  
----Oracle  
--Java技术  
CREATE TABLE BBS  
(  
PARENTID INTEGER NOT NULL,  
ID INTEGER NOT NULL,  
NAME VARCHAR(200) NOT NULL---板块、文章、评论等。  
);  
insert into bbs (PARENTID,ID,NAME) values   
(0,0,论坛首页),  
(0,1,数据库开发),  
(1,11,DB2),  
(11,111,DB2 文章1),  
(111,1111,DB2 文章1 的评论1),  
(111,1112,DB2 文章1 的评论2),  
(11,112,DB2 文章2),  
(1,12,Oracle),  
(0,2,Java技术); 

查询一下DB2的所有文章及评论,怎么办?

WITH TEMP(PARENTID,ID,NAME) AS  
(  
SELECT PARENTID,ID,NAME FROM BBS WHERE NAME=DB2---语句1  
UNION ALL---语句2  
SELECT B.PARENTID,B.ID,B.NAME FROM BBS AS B, TEMP AS T WHERE B.PARENTID=T.ID---语句3  
)  
SELECT NAME FROM TEMP;---语句4  

 

以上是关于db2构建临时结果集的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JDBC 从 Db2 匿名块返回动态结果集?

使用游标加载结果集-DB2存储过程

db2 你可以在同一个存储过程中更改游标结果集吗?

oracle存储过程 中把临时表数据 返回结果集

oracle 存储过程,数据处理并返回结果集问题

转:把存储过程结果集SELECT INTO到临时表