`
珊瑚成长日记
  • 浏览: 21339 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DB2递归实现字符串分组连接操作

 
阅读更多

DB2递归实现字符串分组连接操作

文章转自 http://space.itpub.net/23239992

 

db2中的递归查询使用with来实现,也称为公共表达式,公共表达式在select语句的开始部分采用with子句的形式,在使用公共表达式的查询中可以多次使用它,并且公共表达式还可以通过取别名来连接到他本身,这样的话就可以达到循环的目的。

递归查询通常有3个部分需要定义:

一:一个公共表达式形式的虚拟表。
二:一个初始化表。
三:一个与虚拟表进行完全内连接的辅助表。

需要使用UNION all合并上边3个查询,然后用select从递归输出中得到最终的结果。

大体上如下形式
with XX(x1,x2,x3) as  -------@0
(
select a.s,a.s1 from a  ----@1
union all  ----@2
select * from a,xx where a.s=xx.x1 ------@3
)
select ... from xx where .... -------@4

@0:为with体,即虚拟表
@1:为初始化表,这里需要定义初始化的一些行,也就是你递归的出发点,或者说父行,这部分逻辑只执行一次,它的结果作为虚拟表递归的初始化内容。
@2:这里必须用UNION all
@3:这里需要定义递归的条件(辅助表),这里定义递归的逻辑,需要注意的是父行和子行进行连接的时候逻辑一定要清楚父子关系,不然很容易变成死循环的,这里首先将初始化表的结果作为条件进行查询,在把执行的结果添加到虚拟表中,只要这里能查询出来记录,那么就会进行下一步递归循环。
@4:这里就是对虚拟表的查询语句。

需求:一张实时表,一个人每到一个地方,就有一条记录存在,存放样例:

张三 上海

张三 杭州

.....

要求,按人名进行汇总,将他到过的地方拼接,中间用'#'分隔

数据准备:

--创建表:

CREATE TABLE Recursive_Test
(User_Name VARCHAR(12),
 City VARCHAR(12));

--数据插入

INSERT INTO Recursive_Test(User_Name,City)
      values ('张三','杭州'),('张三','郑州'),('李四','杭州'),
             ('张三','南昌'),('李四','广州'),('王五','北京');

-----递归实现:

WITH Recursive_Test_Par(User_Name,City,Rk_Num) as(
SELECT User_Name,City,ROW_NUMBER() OVER(PARTITION BY User_Name) --分组,生成序列,自我关联之用
FROM Recursive_Test
),
City_Join(User_Name,City,R_Num) as(
SELECT User_Name,CAST(City AS VARCHAR(100)),Rk_Num from Recursive_Test_Par WHERE Rk_Num=1
UNION ALL
SELECT a1.User_Name,CAST(a1.City||'#'||b1.City AS VARCHAR(100)),a1.R_Num+1
  from City_Join a1,Recursive_Test_Par b1
WHERE a1.User_Name=b1.User_Name and a1.R_Num=b1.Rk_Num-1

SELECT a.User_name,a.City FROM City_Join a INNER JOIN
      (SELECT User_Name,max(R_Num) R_Num from City_Join
       GROUP BY User_Name) b
ON a.User_name=b.User_name and a.R_Num=b.R_Num;
 --结果:

 

王五
北京
李四
杭州#广州
张三
杭州#郑州#南昌

分享到:
评论

相关推荐

    db2迁移到mysql.docx

    同样地,在DB2中使用`TO_DATE`函数转换字符串为日期时间,而在MySQL中则使用`STR_TO_DATE`函数。 ```sql -- DB2 SELECT F_GET_STR_TO_DATE(startDate DATETIME, split_format VARCHAR(25), dateType VARCHAR(3)) --...

    面试:如果在现在开发时使用的数据库是DB2(IBM的数据库产品),可能要使用Oracle。在这种背景下,如何开发?

    - 需要检查所有连接数据库的代码,包括JDBC连接字符串、SQL查询、事务管理等,根据Oracle的特性进行调整。例如,DB2的JDBC驱动名可能为`com.ibm.db2.jcc.DB2Driver`,而Oracle的为`oracle.jdbc.OracleDriver`。 5....

    DB2使用经验积累PDF

    - **类似CHARINDEX查找字符在字符串中的位置**:可以使用`POSITION`函数来查找一个字符串在另一个字符串中的位置。 - **类似DATEDIF计算两个日期的相差天数**:可以使用`JULIANDAY`函数结合简单的数学运算来计算两个...

    DB2错误解决手册

    - **01004** - **字符串值被截断**:当试图将一个较长的字符串赋值给一个较短的字段时,字符串会被截断。这可能会影响数据的准确性。 - **01005** - **SQLDA中的条目数不够**:SQLDA(SQL描述数组)是用于描述结果集...

    db2培训文档,语法、函数、存储过程、实例、聚集、递归等

    - `LENGTH`: 返回字符串长度。 - `SUBSTR`: 截取字符串。 - `TRIM`: 去除空格。 2. **数学函数**: - `ABS`: 绝对值。 - `ROUND`: 四舍五入。 - `MOD`: 求模。 3. **日期/时间函数**: - `CURRENT_DATE`: 获取...

    db2与oracle差别.pdf

    例如:CONNECT BY 递归语句、(+)连接操作符、DUAL 表、ROWNUM 伪列、ROWID 伪列、MINUS 操作符、SELECT INTO FOR UPDATE 语句、TRUNCATE TABLE 等。如果要在 DB2 数据库上运行使用了上述方言的应用,就需要进行...

    db2-技术经验总结

    1.11. 格式化字符串(原) 33 1.12. 10大DB2优化技巧 33 1.13. 使用DB2的整数转换浮点小数时注意(原) 41 1.14. 使用递归制造测试数据(原) 42 1.15. 尽量使用自定义函数来代替存储过程 42 1.16. VALUES(…) 与 VALUES ...

    DB2错误代码.doc

    | 01004 | 字符串值在指定给具有较短长度的另一字符串数据类型时被截断。 | | 01005 | SQLDA中的条目数不够。 | | 01007 | 未授予特权。 | | 0100C | 从过程返回了一个或多个特殊结果集。 | | 0100D | 关闭的游标已...

    程序员的SQL金典7-8

     11.5 计算字符在字符串中出现的次数  11.6 去除最高分、最低分  11.6.1 去除所有最低、最高值  11.6.2 只去除一个最低、最高值  11.7 与日期相关的应用  11.7.1 计算销售确认日和制单日之间相差的天数  11.7...

    程序员的SQL金典.rar

     11.5 计算字符在字符串中出现的次数  11.6 去除最高分、最低分  11.6.1 去除所有最低、最高值  11.6.2 只去除一个最低、最高值  11.7 与日期相关的应用  11.7.1 计算销售确认日和制单日之间相差的天数  11.7...

    db2错误代码

    - **01004**:字符串值在指定给具有较短长度的另一字符串数据类型时被截断。 - **01005**:SQLDA中的条目数不够。 - **01007**:未授予特权。 - **0100C**:从过程返回了一个或多个特殊结果集。 - **0100D**:关闭的...

    DB2 错误代码

    - **01004**:字符串值在指定给具有较短长度的另一字符串数据类型时被截断。 - **01005**:SQLDA 中的条目数不够。 - **01007**:未授予特权。 - **0100C**:从过程返回了一个或多个特殊结果集。 - **0100D**:...

    SQL袖珍参考手册(第3版)

    - **字符串函数**: 包括字符串操作的各种函数。 - **子查询**: 嵌套查询的应用。 - **创建表**: 使用CREATE TABLE语句创建表。 - **删除表**: 使用DROP TABLE语句删除表。 - **修改表**: 使用ALTER TABLE语句修改表...

    程序员的SQL金典6-8

    - 如整数类型、字符串类型、日期类型等。 - **记录(Record)** - 表中的一行数据。 - **主键(PrimaryKey)** - 用于唯一标识表中每一条记录的列或列组合。 - **索引(Index)** - 加速数据检索速度的数据结构...

    sql2005教程

    SQL2005中利用xml拆分字符串序列 SQLSERVER2005中分区表的设计 安装SQL Server 2005 时报“-2146233087”错误的解决办法 将Excel表导入到SQL Server 2005 的DB 中文系统上重装SQL Server 2005 英文版的问题 (转...

    ORACLE速成手册 面向应用

    - **字符串函数**:如UPPER、LOWER、TRIM等。 - **数字函数**:如ROUND、TRUNC、MOD等。 - **日期函数**:如ADD_MONTHS、MONTHS_BETWEEN等。 - **转换函数**:如TO_CHAR、TO_DATE等。 - **聚合函数**:如COUNT、SUM...

    javascript进阶.md

    - **字符串连接**:使用`.`操作符进行字符串连接。 - **流程控制**:支持条件语句、循环语句等。 - **函数**:自定义函数的基本语法如下: ```php function add($a, $b) { return $a + $b; } echo add(1, 2); ...

    Sql和jdbc教程(私塾在线)视频配套学习资料

    - **Oracle数据类型**:包括数字类型、字符串类型、日期时间类型等。 - **示例**:VARCHAR2、NUMBER、DATE 等。 ##### 3. DDL与DML - **DDL**(Data Definition Language):用于创建、修改和删除数据库对象(如表...

    AIX常见命令.pptx

    - `vi`中的查找:在非编辑模式下输入`/`加搜索字符串,回车查找。 5. **查找命令**: - `find`: 查找文件。例如,`find /path -name filename`在指定路径下查找文件。还可以根据大小、权限等条件查找。 6. **...

Global site tag (gtag.js) - Google Analytics