在一次项目中遇到一种需求,需要记录某产品的替换记录。

实际应用举例为:产品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实现数据的递归查询的更多相关文章

  1. SQL Server 变更数据捕获(CDC)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  2. SQL Server 迁移数据到MySQL

    一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应 ...

  3. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  4. ORACLE和SQL SERVER的数据同步常用方法

    ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...

  5. 《转》SQL Server 2008 数据维护实务

    SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...

  6. 数据库迁移(SQL SERVER导入数据到MySql)

    地址:http://blog.csdn.net/jiaohougenyang/article/details/44937801 背景:项目最开始时使用的是SQL Server数据库,业务需求现要将数据 ...

  7. 不同版本的SQL Server之间数据导出导入的方法及性能比较

    原文:不同版本的SQL Server之间数据导出导入的方法及性能比较 工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论.补充. 0 ...

  8. SQL Server GUID 数据迁移至MongoDB后怎样查看?

    关键字:SQL Server NEWID():BSON:MongoDB UUID 1.遇到的问题和困惑 SQL Server中的NEWID数据存储到MongoDB中会是什么样子呢?发现不能简单的通过此 ...

  9. sql server导出数据,远程连接失败,需要设置权限

    在sql  server management中右键当前连接——>方面 在 服务器配置中 将  RemoteAccessEnabled.RemoteDacEnabled设置为TRUE 安全性—— ...

随机推荐

  1. 【PL/SQL练习】游标cursor :oracle 在执行sql语句时,为sql语句所分配的一个私有的内存区域

    隐式游标:一次只能返回一行结果(不需要定义,默认自动建立)  显式游标: 需要开发人员提前定义,可以通过循环的方式处理游标里的sql语句,返回多行结果    隐式游标的属性:   sql%rowcou ...

  2. 全局变量&局部变量

    一.局部变量: 定义在函数内部的变量以及函数的形参成为局部变量 作用于:从定义那一行开始知道与其所在的代码块结束 生命周期:从程序运行到定义那一行开始分配存储空间到程序离开该变量所在的作用域 特点: ...

  3. javascript各种兼容性问题,不断更新

    ie6-ie8 不支持textContent支持innerTextchrome  支持textContent  innerTextfireFox    仅支持textContent不支持innerTe ...

  4. 安全终止MFC线程

    终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...

  5. 公司内部openStack环境信息

    公司内部openStack环境信息 yrzl内部openStack云平台平台访问地址,openStack云平台版本为Juno版本内网地址:  http://192.168.3.5:9090/horiz ...

  6. 十四、Struts2的国际化

    十四.Struts2的国际化 1.配置全局国际化消息资源包 配置全局消息资源包 <!--配置全局消息资源包 -->     <constant name="struts.c ...

  7. 怎样在Android中ListView与ArrayAdapter配合使用

    [代码]main.xml   <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  8. 使用TypeScript如何提升JavaScript编程效果?

    TypeScript是个什么鬼?和JavaScript有什么关系? TypeScript是由微软开发的一种可快速入门的开源的编程语言,是JavaScript的一个超集,且向这个语言添加了可选的静态类型 ...

  9. 2. XAML

    1. 什么是 XAML XAML 可以说是 XML 的一个特殊子集,使用相同的语法,只是 XML 可以自定义任何的节点和属性,但 XAML 是有所限制的,只能在规定的命名空间下使用. 2. names ...

  10. u-boot-1.1.6移植之dm9000

    网卡dm9000的执行过程(u-boot版本:u-boot-1.1.6): 在board.c里面有eth_initialize(gd->bd); eth_initialize的实现在eth.c里 ...