首页 新闻 会员 周边 捐助

小弟真诚求一条SQL语句,请各位大侠帮帮忙

0
悬赏园豆:80 [已解决问题] 解决于 2011-09-02 10:58
小弟分不多,真诚请教大侠们一个SQL问题,希望大侠们不吝赐教,小弟在此不甚感激。
有一张表记录物料 如下:(10C是父物料,30C是10C的子物料【30C本身也是父物料】
70C是30C的子物料【70C本身也是父物料】)
ITEMPARENT_CD ITEMCHILD_CD BOM_SQ ……ITEMPARENT_CD是主键
  10CA0001 30CA0001 1
  10CA0001 065A0001 2
  10CA0001 085A0001 3
  30CA0001 70CA0001 4
  30CA0001 021A0001 5
  70CA0001 011A0001 6
现在要一条sql语句根据10C查询出所有他的子物料(同时加上一个等级Level字段)
效果如下:查询条件是10CA0001
Level ITEMCHILD_CD
  1 30CA0001
  2 70CA0001
  3 011A0001
  2 021A0001
  1 065A0001
  1 085A0001
真诚请教大侠们该怎么实现?
问题补充:

通过。net程序怎么实现,能不能提供代码

一缕秋丝的主页 一缕秋丝 | 初学一级 | 园豆:3
提问于:2011-08-31 21:31
< >
分享
最佳答案
0

这个问题使用cte 就比较好解决,建立你看看

http://www.cnblogs.com/jimmyge/archive/2011/03/12/1981998.html

也可以自己去搜索一下 sql cte。

收获园豆:80
脚印 | 初学一级 |园豆:120 | 2011-09-01 11:43
其他回答(6)
0

帮你顶顶,期待sql语句达人登场。

坤坤 | 园豆:919 (小虾三级) | 2011-08-31 22:22
0

DECLARE @TEMP1 VARCHAR(20),@i int,@levelint int
declare @table table (
 levelint int,
 wuliaoA varchar(20),
 wuliaoB varchar(20)
)

set @levelint =1
SET @TEMP1 = 'A1'
insert into @table (levelint,wuliaoA,wuliaoB)
select @levelint,* from LevelTest a where exists (select 1 from LevelTest where a.WuLiaoA = @TEMP1) 

while(@@ROWCOUNT>0)
 begin
  set @levelint = @levelint+1
  insert into @table
  select @levelint,a.* from LevelTest a inner join @table  b
  on a.wuliaoA = b.WuLiaoB
  where not exists (select 1 from @table where WuLiaoA = a.WuLiaoA)
  
 end
 select * from @table

 

把LevelTest 表替换城你的表就OK了.一个递归查询

dearz | 园豆:588 (小虾三级) | 2011-08-31 22:56

我这个已经实现了你要的功能好吗.别告诉我看不懂,

支持(0) 反对(0) dearz | 园豆:588 (小虾三级) | 2011-09-01 17:22
0

USE TEMPDB
GO

CREATE TABLE #TEMP
(
ID
INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
PARENTID
INT
)

INSERT INTO #TEMP
VALUES(0),(1),(2),(3),(3),(2),(3),(2),(3),(2)




;
WITH T AS
(
SELECT 1 AS [Level],* FROM #TEMP WHERE ID=3
UNION ALL
SELECT CASE WHEN T.ID=T.PARENTID THEN T.Level ELSE T.Level+1 END AS [Level],A.* FROM #TEMP AS A INNER JOIN T ON A.PARENTID=T.ID
)
SELECT * FROM T
是这个意思吗?

写代码的小2B | 园豆:4377 (老鸟四级) | 2011-09-01 10:49

我的意思是就像树形结构一样

支持(0) 反对(0) 一缕秋丝 | 园豆:3 (初学一级) | 2011-09-01 12:18

我写的难道不是树?你的那些命名太乱我没有看懂。要是树结构那么上面的代码改改就能用。

支持(0) 反对(0) 写代码的小2B | 园豆:4377 (老鸟四级) | 2011-09-01 13:18
0

不理解你的意思,  你是已经有表结构,只需一条sql语句.   还是说需要帮助你怎么设计.  

如果你已经有表结构, 请把你建表的语句,以及测试数据编写好,这样有助于大家的理解,以便更好的帮助你.

但如果你是需要别人怎么帮你设计. 请把你的需求说明细点吧, 我还是没理解你的意思.

曾斌 | 园豆:162 (初学一级) | 2011-09-01 12:22
不是要设计,就是想能用一条sql语句实现父子级的查询
支持(0) 反对(0) 一缕秋丝 | 园豆:3 (初学一级) | 2011-09-01 12:25
0

建一个表T_Wuliao,表结构和数据如下:

Level  ITEMCHILD_CD
  1     30CA0001
  2     70CA0001
  3     011A0001
  2     021A0001
  1     065A0001
  1     085A0001

然后select * from T_Wuliao,结果100%就是你想要的。

赶紧给分。。。

Martell XO | 园豆:240 (菜鸟二级) | 2011-09-02 09:52

我已经解决了,谢谢您的帮助

支持(0) 反对(0) 一缕秋丝 | 园豆:3 (初学一级) | 2011-09-02 10:58
0

c#代码实现:

//定义全局变量

DataTable oDtOld;
DataTable oDtNew;
int levelID = 0;

//创建表

private void CreateDT(DataTable dtOld, DataTable dtNew)
        {
            oDtOld = new DataTable();
            oDtOld.Columns.Add("VALUE1", typeof(string));
            oDtOld.Columns.Add("VALUE2", typeof(string));
            DataRow DR = oDtOld.NewRow();
            DR[0] = "10CA0001";
            DR[1] = "30CA0001";
            oDtOld.Rows.Add(DR);
            DR = oDtOld.NewRow();
            DR[0] = "10CA0001";
            DR[1] = "065A0001";
            oDtOld.Rows.Add(DR);
            DR = oDtOld.NewRow();
            DR[0] = "10CA0001";
            DR[1] = "085A0001";
            oDtOld.Rows.Add(DR);
            DR = oDtOld.NewRow();
            DR[0] = "30CA0001";
            DR[1] = "70CA0001";
            oDtOld.Rows.Add(DR);
            DR = oDtOld.NewRow();
            DR[0] = "30CA0001";
            DR[1] = "021A0001";
            oDtOld.Rows.Add(DR);
            DR = oDtOld.NewRow();
            DR[0] = "70CA0001";
            DR[1] = "011A0001";
            oDtOld.Rows.Add(DR);
            oDtNew = new DataTable();
            oDtNew.Columns.Add("LEVELID", typeof(string));
            oDtNew.Columns.Add("VALUE", typeof(string));
        }

//变换表

private void ChangeDT(DataTable dtOld, DataTable dtNew, string strWhere)
        {           
            DataRow[] drs = dtOld.Select("VALUE1='" + strWhere + "'");
            if (drs.Length > 0)
            {
                levelID++;
                foreach (DataRow drOld in drs)
                {
                    if (drOld["VALUE2"] != DBNull.Value
                        && !string.IsNullOrEmpty(drOld["VALUE2"].ToString()))
                    {
                        DataRow drNew = oDtNew.NewRow();
                        drNew["LEVELID"] = levelID;
                        drNew["VALUE"] = drOld["VALUE2"];
                        oDtNew.Rows.Add(drNew);
                    }                   
                }
                foreach (DataRow drOld in drs)
                {
                    if (drOld["VALUE2"] != DBNull.Value
                        && !string.IsNullOrEmpty(drOld["VALUE2"].ToString()))
                    {
                        ChangeDT(oDtOld, oDtNew, drOld["VALUE2"].ToString());
                    }                  
                }
            }
        }

//调用以上2个函数

this.CreateDT(oDtOld, oDtNew);
this.ChangeDT(oDtOld, oDtNew, "10CA0001");

在这里oDtNew里存储的数据就是要的结果。

变换该代码的表名和字段名就可以实现你要的功能了哈。呵呵!!希望对你有帮助啦

念念啊 | 园豆:415 (菜鸟二级) | 2011-09-02 11:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册