包含子查询的查询如何写呢 某种成品由A,B,C 三种原物料组成,但其中B的属性是套件,B是由E,F组成 查询的结果要求是 A,C,E,F 怎么写这个查询呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 B是由E,F组成 ----看这个规律.. BOM查询方式?你搜索一下,很多的... --BOM算法--产品配件清单查询示例(邹建)CREATE TABLE Item(ID int,Name varchar(10),Wast decimal(2,2))INSERT Item SELECT 1,N'A产品',0.01UNION ALL SELECT 2,N'B产品',0.02UNION ALL SELECT 3,N'C产品',0.10UNION ALL SELECT 4,N'D配件',0.15UNION ALL SELECT 5,N'E物料',0.03UNION ALL SELECT 6,N'F物料',0.01UNION ALL SELECT 7,N'G配件',0.02CREATE TABLE Bom(ItemID int,ChildId int)INSERT Bom SELECT 1,4UNION ALL SELECT 1,7 --A产品由D配件和G配件组成UNION ALL SELECT 2,1UNION ALL SELECT 2,6UNION ALL SELECT 2,7 --B产品由F物料及G配件组成UNION ALL SELECT 4,5UNION ALL SELECT 4,6 --D配件由F物料组成UNION ALL SELECT 3,2UNION ALL SELECT 3,1 --C产品由A产品和B产品组成GOCREATE FUNCTION f_Bom(@ItemIDs varchar(1000), --要查询物料清单及生产量的产品编号列表(逗号分隔)@Num int --要生产的数量)RETURNS @t TABLE(ItemID int,ChildId int,Nums int,Level int)ASBEGIN DECLARE @Level int SET @Level=1 INSERT @t SELECT a.ItemID,a.ChildId,ROUND(@Num/(1-b.Wast),0),@Level FROM Bom a,Item b WHERE a.ChildId=b.ID AND CHARINDEX(','+RTRIM(a.ItemID)+',',','+@ItemIDs+',')>0 WHILE @@ROWCOUNT>0 and @Level<140 BEGIN SET @Level=@Level+1 INSERT @t SELECT a.ItemID,b.ChildId,ROUND(a.Nums/(1-c.Wast),0),@Level FROM @t a,Bom b,Item c WHERE a.ChildId=b.ItemID AND b.ChildId=c.ID AND a.Level=@Level-1 END RETURNENDGO--调用函数展开产品1、2、3的结构及计算生产10个产品时,各需要多少个配件SELECT a.ItemID,ItemName=b.Name, a.ChildId,ChildName=c.Name, a.Nums,a.LevelFROM f_Bom('1,2,3',10) a,Item b,Item cWHERE a.ItemID=b.ID AND a.ChildId=c.IDORDER BY a.ItemID,a.Level,a.ChildId/*ItemID ItemName ChildId ChildName Nums Level----------- ---------- ----------- ---------- ----------- -----------1 A产品 4 D配件 12 11 A产品 7 G配件 10 11 A产品 5 E物料 12 21 A产品 6 F物料 12 22 B产品 1 A产品 10 12 B产品 6 F物料 10 12 B产品 7 G配件 10 12 B产品 4 D配件 12 22 B产品 7 G配件 10 22 B产品 5 E物料 12 32 B产品 6 F物料 12 33 C产品 1 A产品 10 13 C产品 2 B产品 10 13 C产品 1 A产品 10 23 C产品 4 D配件 12 23 C产品 6 F物料 10 23 C产品 7 G配件 10 23 C产品 7 G配件 10 23 C产品 4 D配件 12 33 C产品 5 E物料 12 33 C产品 6 F物料 12 33 C产品 7 G配件 10 33 C产品 5 E物料 12 43 C产品 6 F物料 12 4(24 row(s) affected)*/drop table itemdrop table bomdrop function f_Bom 天啊,怎么这么复杂,其精髓是不是 函数里,建一个临时表,然后在临时表上插入数据来完成呢,CREATE FUNCTION f_Bom(@ItemIDs varchar(1000), --要查询物料清单及生产量的产品编号列表(逗号分隔)@Num int --要生产的数量)RETURNS @t TABLE(ItemID int,ChildId int,Nums int,Level int)AS为什么里面有用到 RETURNS 这个return 的意思是无条件退出,怎么用在这里呢 的确是 BOM 查询,只是这个太难理解了,有没有更简单的例子呢 ID 水果 上级1 水果 无2 苹果 水果3 青苹果 苹果4 红苹果 苹果5 红富士 红苹果6 蛇果 红苹果7 雪梨 水果如果写SQL 语句,使其结果等于青苹果 红富士 蛇果雪梨 其结论直接到达底层,把节点的都删除掉 我想这个更容易 做到点吧 关于表中一条记录的问题 请高手赐教 数据库基础问题? 巨难问题,怎么更改SQL 2000 里将根目录由c:\...\MSSQL改成d:\MSSQL\ 困扰了我2年的问题,需要高高手解答! 在sqlserver中怎么将一个时间字符串值转换成时间戳的数字形式呢 SQL更新语句,请进来看看... 一个查询语句的编写! 数据库MDF损坏了,有办法 ****列转行问题,急急急 在线等待,谁能回答我这个问题给他200分,在存储过程中怎么样把一个字符串分割? 菜鸟求助...根据日期统计记录 请我的查询哪里有问题?老提示错误.用星号代替列名就没问题.
----
看这个规律..
你搜索一下,
很多的...
--产品配件清单查询示例(邹建)
CREATE TABLE Item(ID int,Name varchar(10),Wast decimal(2,2))
INSERT Item SELECT 1,N'A产品',0.01
UNION ALL SELECT 2,N'B产品',0.02
UNION ALL SELECT 3,N'C产品',0.10
UNION ALL SELECT 4,N'D配件',0.15
UNION ALL SELECT 5,N'E物料',0.03
UNION ALL SELECT 6,N'F物料',0.01
UNION ALL SELECT 7,N'G配件',0.02CREATE TABLE Bom(ItemID int,ChildId int)
INSERT Bom SELECT 1,4
UNION ALL SELECT 1,7 --A产品由D配件和G配件组成
UNION ALL SELECT 2,1
UNION ALL SELECT 2,6
UNION ALL SELECT 2,7 --B产品由F物料及G配件组成
UNION ALL SELECT 4,5
UNION ALL SELECT 4,6 --D配件由F物料组成
UNION ALL SELECT 3,2
UNION ALL SELECT 3,1 --C产品由A产品和B产品组成
GOCREATE FUNCTION f_Bom(
@ItemIDs varchar(1000), --要查询物料清单及生产量的产品编号列表(逗号分隔)
@Num int --要生产的数量
)RETURNS @t TABLE(ItemID int,ChildId int,Nums int,Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t SELECT a.ItemID,a.ChildId,ROUND(@Num/(1-b.Wast),0),@Level
FROM Bom a,Item b
WHERE a.ChildId=b.ID
AND CHARINDEX(','+RTRIM(a.ItemID)+',',','+@ItemIDs+',')>0
WHILE @@ROWCOUNT>0 and @Level<140
BEGIN
SET @Level=@Level+1
INSERT @t SELECT a.ItemID,b.ChildId,ROUND(a.Nums/(1-c.Wast),0),@Level
FROM @t a,Bom b,Item c
WHERE a.ChildId=b.ItemID
AND b.ChildId=c.ID
AND a.Level=@Level-1
END
RETURN
END
GO--调用函数展开产品1、2、3的结构及计算生产10个产品时,各需要多少个配件
SELECT a.ItemID,ItemName=b.Name,
a.ChildId,ChildName=c.Name,
a.Nums,a.Level
FROM f_Bom('1,2,3',10) a,Item b,Item c
WHERE a.ItemID=b.ID
AND a.ChildId=c.ID
ORDER BY a.ItemID,a.Level,a.ChildId/*
ItemID ItemName ChildId ChildName Nums Level
----------- ---------- ----------- ---------- ----------- -----------
1 A产品 4 D配件 12 1
1 A产品 7 G配件 10 1
1 A产品 5 E物料 12 2
1 A产品 6 F物料 12 2
2 B产品 1 A产品 10 1
2 B产品 6 F物料 10 1
2 B产品 7 G配件 10 1
2 B产品 4 D配件 12 2
2 B产品 7 G配件 10 2
2 B产品 5 E物料 12 3
2 B产品 6 F物料 12 3
3 C产品 1 A产品 10 1
3 C产品 2 B产品 10 1
3 C产品 1 A产品 10 2
3 C产品 4 D配件 12 2
3 C产品 6 F物料 10 2
3 C产品 7 G配件 10 2
3 C产品 7 G配件 10 2
3 C产品 4 D配件 12 3
3 C产品 5 E物料 12 3
3 C产品 6 F物料 12 3
3 C产品 7 G配件 10 3
3 C产品 5 E物料 12 4
3 C产品 6 F物料 12 4(24 row(s) affected)
*/
drop table item
drop table bom
drop function f_Bom
CREATE FUNCTION f_Bom(
@ItemIDs varchar(1000), --要查询物料清单及生产量的产品编号列表(逗号分隔)
@Num int --要生产的数量
)RETURNS @t TABLE(ItemID int,ChildId int,Nums int,Level int)
AS
为什么里面有用到 RETURNS 这个return 的意思是无条件退出,怎么用在这里呢
1 水果 无
2 苹果 水果
3 青苹果 苹果
4 红苹果 苹果
5 红富士 红苹果
6 蛇果 红苹果
7 雪梨 水果
如果写SQL 语句,使其结果等于青苹果
红富士
蛇果
雪梨 其结论直接到达底层,把节点的都删除掉
我想这个更容易 做到点吧