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 安全性—— ...
随机推荐
- 【考试】简单的sql语句
)显示正好为5个字符的员工的姓名 HR@ORA11GR2>select last_name,first_name from employees ; )显示不带有"R"的员工的 ...
- oracle 删除表、表空间、用户时,如何释放磁盘空间
truncate table tablename DROP STORAGE; drop 执行drop table xx 语句drop后的表被放在回收站(user_recyclebin)里,而不是直接删 ...
- 创投女王徐新:如何迅速做到细分市场第一(FW)
http://mp.weixin.qq.com/s?__biz=MjM5NzUxNTQ2Mw==&mid=203368116&idx=2&sn=e586a2f28dfb2b50 ...
- python列表的常用操作方法
主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等,需要的朋友可以参考下. 1.创建列表.只要把逗号分隔的不同的数据项使用方括号括起来即可 List = [ ...
- vyatta的fork开源版本
https://www.reddit.com/r/networking/comments/3dvwfy/who_here_is_using_vyos/ Vyatta came in two flavo ...
- dedecms手机站要同步pc站的图片
首先在dede目录下面找到 /include/extend.func.php 文件 //添加自定义函数 function replaceurl($newurl){ $newurl=str_repl ...
- CentOS下通过rdesktop连接Windows远程桌面
众所周知,微软的Windows提供了一种远程桌面系统(Remote Desktop),该服务的默认端口是3389,可使用户远程登录进行系统管理或作为终端服务器运行各种应用软件. 而要连接Windows ...
- about control %CPU
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #define timesize 200000 ...
- 网站屏蔽指定ip
修改.htaccess文件 Order Deny,Allow //开启屏蔽Deny from 124.64.242.117 //要屏蔽的ip
- Rich控件二
Calendar控件 使用案例: 在Default.aspx中: <div> <h1>Calendar控件</h1> <asp:Calendar ID=&q ...