SQL递归查询(with cte as) 物料分解

需求

最近在做一个MRP的项目,需要根据生产下达的计划从原始无聊表中分解出成品所需要的原材料和数量.

参考

http://www.cnblogs.com/xqhppt/archive/2011/02/15/1955366.html

http://www.cnblogs.com/guoysh1987/archive/2011/12/23/2299379.html

代码实现

SQL数据表结构

CREATE TABLE [dbo].[cProduction](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Production] [varchar](max) NULL,
    [MaterialNo] [varchar](100) NULL,
    [CompQuan] [float] NULL
) ON [PRIMARY]

GO

INSERT INTO cProduction VALUES(‘JCV3311149605‘,‘A5E01194561‘,1)
INSERT INTO cProduction VALUES(‘JCV3311149605‘,‘JCV2511141838‘,1)
INSERT INTO cProduction VALUES(‘JCV3311149605‘,‘JCV2511141929‘,1)
INSERT INTO cProduction VALUES(‘JCV2511141838‘,‘JCV3311800707‘,1)
INSERT INTO cProduction VALUES(‘JCV3311800707‘,‘JCVRM00040003‘,1)
INSERT INTO cProduction VALUES(‘JCV3311800707‘,‘JCVRM00040004‘,1)

SQL代码实现

假设对产品JCV3311149605下达的计划为1000

with cte as(
select [Production],[MaterialNo],[CompQuan]*1000 as quan,1 as lvl,path=CAST(CompQuan AS INT) from cProduction where Production = ‘JCV3311149605‘
union all
select d.[Production],d.[MaterialNo],C.path*d.[CompQuan]*1000 as quan,lvl+1,path=CAST(D.CompQuan*c.path AS int)  from cte c inner join cProduction d on c.materialno = d.Production
) select * from cte OPTION(MAXRECURSION 0) 

效果如下,结果正确:

时间: 2024-10-05 20:16:52

SQL递归查询(with cte as) 物料分解的相关文章

SQL递归查询(with cte as)

http://www.cnblogs.com/xqhppt/archive/2011/02/15/1955366.html 2011-02-15 16:41 by 忧忧夏天, 2415 阅读, 0 评论, 收藏, 编辑 with cte as(select Id,Pid,DeptName,0as lvl from Departmentwhere Id =2unionallselect d.Id,d.Pid,d.DeptName,lvl+1from cte c innerjoin Departme

SQL Server2005使用CTE实现递归

本文来自:http://www.cnblogs.com/wenjl520/archive/2010/01/18/1650393.html CTE递归原理: 递归CTE是由两个最小查询构建的.第一个是定位成员(Anchor Member,AM),它是一个非递归查询,第二个是递归成员(Recursive Member,RM),它是递归查询.在CTE括号中(AS 子句之后),定义独立查询或引用回相同CTE的查询,AM与RM由UNION ALL语句分隔.AM紧被调用一次,RM将被重复调用,直到查询不在返

【转】sql递归查询问题

原文链接地址http://www.cnblogs.com/sweting/archive/2009/06/08/1498483.html 在工作中遇到一个问题,是需要sql递归查询的.不懂,于是到csdn上去问,那里的效率真是非常高,我以前也没在上面问过问题. 问题描述: 我有一个表结构如下:id upperid1     23     24     15     3 具体层次不知道,我想用递归sql语句把所有属于某个upperid的数据,包括它的子树,都读出去,请问应该子怎么写?      比

Sql递归查询

/*Sql递归查询*/ /* 实际就是把所有树的节点查找出来 Oracle的一个表中也可以保存树形结构信息,用start with...connect by等关键字 eg:创建表并插入数据 */ Create table Tree(son char(10),father char(10)); insert into tree (SON, FATHER) values ('孙子1', '儿子'); insert into tree (SON, FATHER) values ('孙子2', '儿子'

sql server利用cte递归查询

1.数据环境准备 参考Oracle递归查询文章. 2.查询某个节点下的所有子节点 with cte(id,name,parent_id) as ( select id,name,parent_id from SC_DISTRICT where name='巴中市' union all select sd.id,sd.name,sd.parent_id from SC_DISTRICT sd ,cte c where c.id = sd.parent_id )select * from cte r

SQL中的CTE通用表表达式

开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-SQL (T-SQL) 查询.这一常规使开发人员能获取一个行集,并立即将该行集加入到 SELECT 语句中的其他表.视图和用户定义函数中.另一种方案是使用视图而不是派生表.这两种方案都有其各自的优势和劣势. 当使用 SQL Server™ 2005 时,我更倾向于第三种方案,就是使用通

SQL With (递归CTE查询)

指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).该表达式源自简单查询,并且在单条 SELECT.INSERT.UPDATE 或 DELETE 语句的执行范围内定义.该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分.公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式. 语法 [ WITH <common_table_expression> [ ,...n ] ] <common_table_expression>

SQL Server 【CTE + FOR XML PATH】使用笔记~

CREATE FUNCTION [dbo].[Getxxxxxxxxx] ( @productCategoryId INT, @SplitChar varchar ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @returnProductCategory NVARCHAR(MAX)=N'' /*-- 注意,CTE 表达式前面必须要用分号“;”把其代码分开,建议在WITH前面加分号“;” --*/ ;WITH cte AS ( SELECT ProductCat

关于Oracle、SqlServer 的sql递归查询

递归查询所有子节点 oracle SELECT * FROM hrmdepartment              START WITH  id=22              CONNECT BY PRIOR id=supdepid sqlserver with result_table as               (                  select a.id,a.lastname,a.managerid from hrmresource a where id=321