bom 展开 sql 查询 方法

taizhou3D 2014-11-14 02:28:01

应该没有 自动增长列,我自己+了个 identity(int,1,1)

SELECT identity(int,1,1) as ID, [Flag]
,[ProductID]
,[SubProdID]
,[QtyOfBatch]
,[BatchAmount] into #TempBom
FROM [CHIComp88].[dbo].[prdBOMMats] where ProductID='HCFWC11A.00000000000'

select * from #TempBom



存放到 虚拟表#TempBom中

下面的

;WITH t AS
(
SELECT ID,lvl=0,px=CAST(ID AS VARBINARY),ProductID, SubProdID
FROM #TempBom t
--WHERE ProductID='HCFWC11A.00000000000'
UNION ALL
SELECT a.ID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY),a.ProductID, b.SubProdID
FROM #TempBom a
JOIN t b
ON a.ProductID = b.SubProdID
)
SELECT a.*,lvl
FROM #TempBom a
JOIN t b
ON a.ProductID=b.SubProdID
ORDER BY b.px
drop table #TempBom



结果还是出不来

新手,请教
...全文
603 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-11-14
  • 打赏
  • 举报
回复
#16: ProductID 和 SubProdID 关联已经在 t 的建树中用到了。输出语句中再用这个条件没意义。

发现错误了
;WITH t AS
(
SELECT ID,lvl=0,px=CAST(ID AS VARBINARY),ProductID, SubProdID
FROM #TempBom t
--WHERE ProductID='HCFWC11A.00000000000'
UNION ALL
SELECT a.ID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY),
a.ProductID,
b.SubProdID --等于再输出一个 a.ProductID 算什么?应该是 a.SubProdID
FROM #TempBom a
JOIN t b
ON a.ProductID = b.SubProdID --它们是相等的
)
taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 14 楼 Tiger_Zhao 的回复:
这我知道,你的id不就是用来区分#TempBom中的每个节点的! 你在 t 中构建了一棵树,按路径直接输出就是
SELECT * FROM t ORDER BY px
但是你需要输出的内容除了lvl外其他都是#TempBom的内容,所以用ID一对一关联啊,关ProductID、SubProdID什么事?
SELECT a.*,t.lvl
   FROM t
   JOIN #TempBom a ON a.ID = t.ID
 ORDER BY t.px
明白你们的意思了,关键在ID , 我这里的数据 是 ProductID 和 SubProdID 关联
Tiger_Zhao 2014-11-14
  • 打赏
  • 举报
回复
#14 回复 #10
--------
回复 #11: 你给出的12条记录都是父节点为 HCFWC11A.00000000000,明明只有1层,怎么可能有12层。
Tiger_Zhao 2014-11-14
  • 打赏
  • 举报
回复
这我知道,你的id不就是用来区分#TempBom中的每个节点的!
你在 t 中构建了一棵树,按路径直接输出就是
SELECT * FROM t ORDER BY px

但是你需要输出的内容除了lvl外其他都是#TempBom的内容,所以用ID一对一关联啊,关ProductID、SubProdID什么事?
SELECT a.*,t.lvl
FROM t
JOIN #TempBom a ON a.ID = t.ID
ORDER BY t.px

中国风 2014-11-14
  • 打赏
  • 举报
回复
首先取最顶层如: --ID 父ID (要有关联) ID parentID 1 0 2 1 3 1 ----------- 首先取第1条记录 --lev=1 再次父ID(parentID=1)--Lev=2
中国风 2014-11-14
  • 打赏
  • 举报
回复
引用 7 楼 taizhou3D 的回复:
说实话,我不是太理解 http://blog.csdn.net/htl258/article/details/5717165 里面的意思,所以才到这里 请教 上面的结果还是一样的 ,没有数据
看MSDN联机语法的例子 http://msdn.microsoft.com/zh-cn/library/ms175972(v=sql.90).aspx
taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 10 楼 taizhou3D 的回复:
[quote=引用 8 楼 Tiger_Zhao 的回复:]
;WITH t AS
(
-- 这已经是棵树了
)
SELECT a.*,lvl
FROM #TempBom a
JOIN t b
ON a.ID=b.ID --要输出结果应该是用ID关联啊
ORDER BY b.px


id 在原先的数据库里面 是没有的 。 我自己增加上去的自动增长列 [/quote]

是的 , 是用ID 连接查询,结果出来一半 ,


最后的结果 ,应该是 id 和 lvl的 值 相等
taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 8 楼 Tiger_Zhao 的回复:
;WITH t AS
(
    -- 这已经是棵树了
)
SELECT a.*,lvl
FROM #TempBom a
    JOIN t b 
       ON a.ID=b.ID --要输出结果应该是用ID关联啊
ORDER BY b.px
id 在原先的数据库里面 是没有的 。 我自己增加上去的自动增长列
还在加载中灬 2014-11-14
  • 打赏
  • 举报
回复
;WITH t AS
(
    SELECT ID,lvl=0,px=CAST(ID AS VARBINARY),ProductID, SubProdID
    FROM #TempBom t
    WHERE NOT EXISTS(SELECT 1 FROM #TempBom WHERE SubProdID=t.ProductID)
    UNION ALL
    SELECT a.ID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY),a.ProductID, b.SubProdID
    FROM #TempBom a
       JOIN t b
           ON  a.SubProdID = b.ProductID
)SELECT * FROM t
参照版主,这样有数据吗
Tiger_Zhao 2014-11-14
  • 打赏
  • 举报
回复
;WITH t AS
(
-- 这已经是棵树了
)
SELECT a.*,lvl
FROM #TempBom a
JOIN t b
ON a.ID=b.ID --要输出结果应该是用ID关联啊
ORDER BY b.px

taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 6 楼 roy_88 的回复:
你应该把关系搞错了,这样试试
;WITH t AS
(
    SELECT ID,lvl=0,px=CAST(ID AS VARBINARY),ProductID, SubProdID
    FROM #TempBom t
    WHERE NOT EXISTS(SELECT 1 FROM #TempBom WHERE SubProdID=t.ProductID)
    UNION ALL
    SELECT a.ID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY),a.ProductID, b.SubProdID
    FROM #TempBom a
       JOIN t b
           ON  a.SubProdID = b.ProductID
)
SELECT a.*,lvl
FROM #TempBom a
    JOIN t b 
       ON a.ProductID=b.SubProdID
ORDER BY b.px
drop table #TempBom
说实话,我不是太理解 http://blog.csdn.net/htl258/article/details/5717165 里面的意思,所以才到这里 请教 上面的结果还是一样的 ,没有数据
中国风 2014-11-14
  • 打赏
  • 举报
回复
你应该把关系搞错了,这样试试
;WITH t AS
(
    SELECT ID,lvl=0,px=CAST(ID AS VARBINARY),ProductID, SubProdID
    FROM #TempBom t
    WHERE NOT EXISTS(SELECT 1 FROM #TempBom WHERE SubProdID=t.ProductID)
    UNION ALL
    SELECT a.ID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY),a.ProductID, b.SubProdID
    FROM #TempBom a
       JOIN t b
           ON  a.SubProdID = b.ProductID
)
SELECT a.*,lvl
FROM #TempBom a
    JOIN t b 
       ON a.ProductID=b.SubProdID
ORDER BY b.px
drop table #TempBom
taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 hwhmh2010 的回复:
你这语法都不对呀。。。你想要什么样的结果?
又或者是 没有自动增长列的 bom 表 ,如何 用 递归 把所有的 阶层 查出来
taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 3 楼 ky_min 的回复:
没发现这两个a.ProductID = b.SubProdID的对应关系
数据库 图片 截图 比较少 ,数据库里面 肯定有这样的关系
还在加载中灬 2014-11-14
  • 打赏
  • 举报
回复
没发现这两个a.ProductID = b.SubProdID的对应关系
taizhou3D 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 hwhmh2010 的回复:
你这语法都不对呀。。。你想要什么样的结果?
就是查询 这个 bom 下面所有的 结构,数据 我参照了 http://blog.csdn.net/htl258/article/details/5717165 里面的方法
山寨DBA 2014-11-14
  • 打赏
  • 举报
回复
你这语法都不对呀。。。你想要什么样的结果?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧