小弟分不多,真诚请教大侠们一个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程序怎么实现,能不能提供代码
这个问题使用cte 就比较好解决,建立你看看
http://www.cnblogs.com/jimmyge/archive/2011/03/12/1981998.html
也可以自己去搜索一下 sql cte。
帮你顶顶,期待sql语句达人登场。
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了.一个递归查询
我这个已经实现了你要的功能好吗.别告诉我看不懂,
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
我的意思是就像树形结构一样
我写的难道不是树?你的那些命名太乱我没有看懂。要是树结构那么上面的代码改改就能用。
不理解你的意思, 你是已经有表结构,只需一条sql语句. 还是说需要帮助你怎么设计.
如果你已经有表结构, 请把你建表的语句,以及测试数据编写好,这样有助于大家的理解,以便更好的帮助你.
但如果你是需要别人怎么帮你设计. 请把你的需求说明细点吧, 我还是没理解你的意思.
建一个表T_Wuliao,表结构和数据如下:
Level ITEMCHILD_CD
1 30CA0001
2 70CA0001
3 011A0001
2 021A0001
1 065A0001
1 085A0001
然后select * from T_Wuliao,结果100%就是你想要的。
赶紧给分。。。
我已经解决了,谢谢您的帮助
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里存储的数据就是要的结果。
变换该代码的表名和字段名就可以实现你要的功能了哈。呵呵!!希望对你有帮助啦