010_递归

-- create Employees table and insert values

IF OBJECT_ID(‘Employees‘) IS NOT NULL

DROP TABLE Employees

GO

CREATE TABLE Employees

(

empid INT NOT NULL,

mgrid INT NULL,

empname VARCHAR(25) NOT NULL,

salary MONEY NOT NULL

)

GO

IF OBJECT_ID(‘Departments‘) IS NOT NULL

DROP TABLE Departments

GO

-- create Departments table and insert values

CREATE TABLE Departments

(

deptid INT NOT NULL PRIMARY KEY,

deptname VARCHAR(25) NOT NULL,

deptmgrid INT

)

GO

-- fill datas

INSERT INTO employees VALUES  (1,NULL,‘Nancy‘,00.00)

INSERT INTO employees VALUES  (2,1,‘Andrew‘,00.00)

INSERT INTO employees VALUES  (3,1,‘Janet‘,00.00)

INSERT INTO employees VALUES  (4,1,‘Margaret‘,00.00)

INSERT INTO employees VALUES  (5,2,‘Steven‘,00.00)

INSERT INTO employees VALUES  (6,2,‘Michael‘,00.00)

INSERT INTO employees VALUES  (7,3,‘Robert‘,00.00)

INSERT INTO employees VALUES  (8,3,‘Laura‘,00.00)

INSERT INTO employees VALUES  (9,3,‘Ann‘,00.00)

INSERT INTO employees VALUES  (10,4,‘Ina‘,00.00)

INSERT INTO employees VALUES  (11,7,‘David‘,00.00)

INSERT INTO employees VALUES  (12,7,‘Ron‘,00.00)

INSERT INTO employees VALUES  (13,7,‘Dan‘,00.00)

INSERT INTO employees VALUES  (14,11,‘James‘,00.00)

INSERT INTO departments VALUES  (1,‘HR‘,2)

INSERT INTO departments VALUES  (2,‘Marketing‘,7)

INSERT INTO departments VALUES  (3,‘Finance‘,8)

INSERT INTO departments VALUES  (4,‘R&D‘,9)

INSERT INTO departments VALUES  (5,‘Training‘,4)

INSERT INTO departments VALUES  (6,‘Gardening‘,NULL)

GO

SELECT * FROM employees

SELECT * FROM departments

-- table-value function

IF OBJECT_ID(‘fn_getsubtree‘) IS NOT NULL

DROP FUNCTION  fn_getsubtree

GO

CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT)

RETURNS TABLE

AS

RETURN(

WITH Employees_Subtree(empid, empname, mgrid, lvl)

AS

(

-- Anchor Member (AM)

SELECT empid, empname, mgrid, 0

FROM employees

WHERE empid = @empid

UNION ALL

-- Recursive Member (RM)

SELECT e.empid, e.empname, e.mgrid, es.lvl+1

FROM employees AS e

join employees_subtree AS es

ON e.mgrid = es.empid

)

SELECT * FROM Employees_Subtree

)

GO

-- cross apply query

SELECT *

FROM Departments AS D

CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST

-- outer apply query

SELECT *

FROM Departments AS D

OUTER APPLY fn_getsubtree(D.deptmgrid) AS ST

SELECT *

FROM Departments d

OUTER APPLY (SELECT * FROM employees e WHERE d.deptmgrid=e.mgrid) q

select *from dbo.Customers as C outer apply

(select top 2 *     from dbo.Orders as O

where C.customerid=O.customerid     order by orderid desc) as CA

CREATE TABLE [aaa](

[id] [int] NULL,

[pid] [int] NULL,

[name] [nchar](10)

)

GO

INSERT INTO aaa VALUES(1,0,‘a‘)

INSERT INTO aaa VALUES(2,0,‘b‘)

INSERT INTO aaa VALUES(3,1,‘c‘)

INSERT INTO aaa VALUES(4,1,‘d‘)

INSERT INTO aaa VALUES(5,2,‘e‘)

INSERT INTO aaa VALUES(6,3,‘f‘)

INSERT INTO aaa VALUES(7,3,‘g‘)

INSERT INTO aaa VALUES(8,4,‘h‘)

GO

--下面的Sql是查询出1结点的所有子结点

with my1 as(select * from aaa where id = 1

union all select aaa.* from my1, aaa where my1.id = aaa.pid

)

select * from my1 --结果包含1这条记录,如果不想包含,可以在最后加上:where id <> 1

--下面的Sql是查询出8结点的所有父结点

with my1 as(select * from aaa where id = 8

union all select aaa.* from my1, aaa where my1.pid = aaa.id

)

select * from my1

--eg:

CREATE TABLE [tb](

[qj] [int] NULL,    -- 月份,本测试假设从1月份开始,并且数据都是连续的月份,中间没有隔断

[je] [int] NULL,    -- 本月销售实际金额

[rwe] [int] NULL,    -- 本月销售任务额

[fld] [float] NULL    -- 本月金额大于任务额时的返利点,返利额为je*fld

) ON [PRIMARY]

--现在要求计算每个月的返利金额,规则如下:

--1月份销售金额大于任务额  返利额=金额*返利点

--2月份销售金额大于任务额  返利额=(金额-1月份返利额)*返利点

--3月份销售金额大于任务额  返利额=(金额-1,2月份返利额)*返利点

--以后月份依次类推,销售额小于任务额时,返利为0

--具体的Sql如下:

WITH    my1

AS ( SELECT   * ,

CASE WHEN je > rwe THEN ( je * fld )

ELSE 0

END fle ,

CAST(0 AS FLOAT) tmp

FROM     tb

WHERE    qj = 1

UNION ALL

SELECT   tb.* ,

CASE WHEN tb.je > tb.rwe

THEN ( tb.je - my1.fle - my1.tmp ) * tb.fld

ELSE 0

END fle ,

my1.fle + my1.tmp tmp -- 用于累加前面月份的返利

FROM     my1 ,

tb

WHERE    tb.qj = my1.qj + 1

)

SELECT  *

FROM    my1

*/

时间: 2024-11-06 12:22:43

010_递归的相关文章

PHP_递归实现无限级分类

<?php /** * 递归方法实现无限级别分类 * @param array $list 要生成树形列表的数组[该数组中必须要有主键id 和 父级pid] * @param int $pid=0 父级id * @param int $level=0 缩进次数[用于指定分类名称要缩进的数量] */ function getTree($list,$pid=0,$level=0 ) { // static 表示声明一个静态变量, 静态变量在函数中会一直保存它的值 static $tree = arr

3.sql中的向上递归和向下递归

1.向下递归 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with bmbm(本级关联条件)='610000000000'(本级编码)--包含本级 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with sjbmbm(本级关联条件)='6100000

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

python3 递归

递归调用: 在调用一个函数的过程中,直接或者简介调用了该函数本身 必须有一个明确的结束条件 l = [1,[2,3,[4,5,[6,7,[8,9,[10,11,[12,13]]]]]]] def func(l): for i in l: if isinstance(i,list): func(i) else: print(i) func(l) 应用场景:不知道应该循环多少次,只知道什么时候应该结束

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

浅谈递归调用的个人领悟

从大一开始学c,就不是挺理解递归的,最近突然有所体会: 递归调用中递归调用的函数可以把它想象成为一个树的结点,在函数中调用自身就是一个分支,直到出口条件时就是这棵树的叶子结点.叶子的值便是出口返回的值.最后从叶子结点按照你所调用的方法向上返回值,最终结束递归调用.

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Java递归流程

递归二字顾名思义就是:递过去,归回来.所以我索性叫它做有借有还吧. 下面的例子由c而来: public class Main {                                public static void main(String[] args) {                                      fun(1);                                }                                publ

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,