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 安全性—— ...
随机推荐
- windows7 下的日期没有internet时间的选项卡
原因1:你在某个域里面,退出就可以了 原因2:你把windows Time的服务给禁掉或者关掉了, 步骤:运行,输入services.msc 确定,查找到windows Time开了即可
- NSString用法
1 创造字符串 NSString *str1 = @"hello"; NSString *str2 = [NSString string]; NSString *str3 = [N ...
- NFS服务器
NFS是网络文件系统(Network File System)的简称,可实现在多种网络上共享和装配远程文件系统.最大的功能是通过网络,让不同操作系统的计算机共享数据,所以它可以看成一个文件服务器. 1 ...
- AD采样问题总结
说明:来源http://bbs.csdn.net/topics/390899032论坛讨论 一个100HZ的正弦波,我用300HZ的采样率去采样,那么根据香农定律是不是一秒钟就采集到300个点,因为这 ...
- OpenJudge 核电站
描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 输入 只 ...
- Android多线程异步处理:AsyncTask 的实现原理
AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法.注意继承时需要设定三个泛型P ...
- 使用VAssistX给文件和函数添加注释-2015.12.31
在Visual Studio使用VAssistX助手可以非常方便的给文件和函数添加注释,增加更多的记录信息,从而方便在时间久后,对代码阅读理解的提示,以及别人后续对代码的维护和BUG修改. 添加头文件 ...
- c89和c99的区别【转】
//本文转自:http://www.360doc.com/content/10/0324/18/2633_20101093.shtml 注: GCC支持C99, 通过 --std=c99 命令行参数开 ...
- 必须会的SQL语句(三)插入
1.规范一些使用插入语句的小规范 1)中文字符串前 最好 加一个N 2)列名用中括号 扩起来 像这样 [列名] 2.常规写法 Insert into tableName ( [col ...
- Objective-C介绍
概述 2007年苹果公司推出了Objective—C 2.0,它是Mac OS X和iOS开发的基础语言.