SQL Server实现数据的递归查询
在一次项目中遇到一种需求,需要记录某产品的替换记录。
实际应用举例为:产品101被201替换,之后201又被303替换,303又被109替换;产品102被202替换,之后202又被105替换。
现在我们需要在已知任何产品序列号时,可以检索出该产品的整个被替换过程和最终的替换结果。
设计表格如下:
产品替换记录(原序列号,替换后序列号)
示例数据如下:
| 原序列号 | 替换后序列号 |
| 101 | 201 |
| 102 | 202 |
| 201 | 303 |
| 303 | 109 |
| 202 | 105 |
比如,已经表中存在过201这一产品,那么我想知道201这个产品之后的整个替换过程,那么我们应该可以检索出从201到109的整个过程。
下面我们就来实现这种递归查询:
先创建表并插入示例数据:
CREATE TABLE ProductHistory
(
OrgProduct int,
CurProduct int
);
INSERT INTO ProductHistory values
(101,201),
(102,202),
(201,303),
(303,109),
(202,105)
下面开始我们的递归查询:
WITH PHistory(Org,Cur) AS
(
SELECT OrgProduct,CurProduct FROM ProductHistory WHERE OrgProduct=201
UNION ALL
SELECT A.OrgProduct,A.CurProduct FROM ProductHistory A, PHistory B
WHERE A.OrgProduct=B.Cur
)
select * from PHistory
查询结果如下:

从结果中我们可以看到,201产品被303产品替换了,303产品又被109产品替换了。
如果我们想追溯201产品之前的记录,那么我们只要把查询条件交换一下即可:
WITH PHistory(Org,Cur) AS
(
SELECT OrgProduct,CurProduct FROM ProductHistory WHERE OrgProduct=201
UNION ALL
SELECT A.OrgProduct,A.CurProduct FROM ProductHistory A, PHistory B
WHERE A.CurProduct=B.Org --将查询条件交换一下就可以追溯历记录
)
select * from PHistory
结果如下:

可以看出,产品201曾经替换了产品101,而后201产品又被303替换了。
到此,我们成功实现了SQL的递归查询。
遗留问题:暂时我没有想出可以同时向上和向下递归的算法。
SQL Server实现数据的递归查询的更多相关文章
- SQL Server 变更数据捕获(CDC)监控表数据
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...
- SQL Server 迁移数据到MySQL
一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应 ...
- 在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
- ORACLE和SQL SERVER的数据同步常用方法
ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...
- 《转》SQL Server 2008 数据维护实务
SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...
- 数据库迁移(SQL SERVER导入数据到MySql)
地址:http://blog.csdn.net/jiaohougenyang/article/details/44937801 背景:项目最开始时使用的是SQL Server数据库,业务需求现要将数据 ...
- 不同版本的SQL Server之间数据导出导入的方法及性能比较
原文:不同版本的SQL Server之间数据导出导入的方法及性能比较 工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论.补充. 0 ...
- SQL Server GUID 数据迁移至MongoDB后怎样查看?
关键字:SQL Server NEWID():BSON:MongoDB UUID 1.遇到的问题和困惑 SQL Server中的NEWID数据存储到MongoDB中会是什么样子呢?发现不能简单的通过此 ...
- sql server导出数据,远程连接失败,需要设置权限
在sql server management中右键当前连接——>方面 在 服务器配置中 将 RemoteAccessEnabled.RemoteDacEnabled设置为TRUE 安全性—— ...
随机推荐
- Card objects
There are fifty-two cards in a deck, each of which belongs to one of four suits and one of thirteen ...
- ZJOI2009 假期的宿舍
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- php 调用.net的webservice 需要注意的
首先 SoapClient类这个类用来使用Web services.SoapClient类可以作为给定Web services的客户端.它有两种操作形式:* WSDL 模式* Non-WSDL 模式在 ...
- Symantec System Recovery
目的:备份系统,备份文件,裸机恢复,异机恢复等 工具:http://bbs.kafan.cn/thread-1800182-1-1.html 下载地址:http://pan.baidu.com/s/1 ...
- Highcharts 连续的堆积面积图
说明:设置两个柱形图间距为0 Highcharts柱图,设置X轴各Column的间距 plotOption : { column : { // 设置每个柱自身的宽度 ...
- ArcMap中用VBA读度矢量图层信息
ArcMap下用VBA操作图层基本的过程了. Private Sub UIButtonControl1_Click() Dim pApp As IApplication Set pApp = Appl ...
- ubuntu12.04 下安装matlab2012
1.下载matlab2012a(例如:****.iso) 2.创建挂载目录 sudo mkdir /media/matlab 3.将当前目录切换到镜像文件的目录,然后将镜像文件挂载到刚刚创建的目录下 ...
- linux使用dd命令快速生成大文件
dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero ...
- JS数组(Array)处理函数总结
1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: <script type="text/javascript"&g ...
- chrome调试学习
参考:http://ued.taobao.com/blog/2012/06/debug-with-chrome-dev-tool/ http://guoshuang.com/frontend/chro ...