Office中国论坛/Access中国论坛

标题: 超难问题 [打印本页]

作者: 鱼儿游游    时间: 2012-7-18 10:42
标题: 超难问题
本帖最后由 鱼儿游游 于 2012-7-18 14:49 编辑

不用临时表的方法,如何用SQL语句从左图显示的数据表得到图1、图2的记录集(即查找指定节点的所有子节点):

[attach]49695[/attach]
[attach]49693[/attach]
[attach]49698[/attach]
作者: gxy1000    时间: 2012-7-18 11:02
{:soso_e112:}
作者: t小宝    时间: 2012-7-18 11:56
????
作者: todaynew    时间: 2012-7-18 12:40
很简单的问题嘛。有两种解决办法:
方法一:定义个数组,其元素存放各类ParentID,比如A(1)=“2,12,11”,A(2)="3,7",剩下怎么搞法你懂的。
方法二:在商品分类表中增加一个字段,比如叫做Class,该字段用于存放ParentID之上的大类数据,剩下怎么搞法你懂的。
作者: 鱼儿游游    时间: 2012-7-18 14:30
t小宝 发表于 2012-7-18 11:56
????

小宝,你有什么好方法?
作者: t小宝    时间: 2012-7-18 15:44
搞不懂你什么意思,这个SQL语句不是很简单么。。。
Select CategoryID,CategoryLabel From 商品分类表 Where ParentID=2
Select CategoryID,CategoryLabel From 商品分类表 Where ParentID=3

作者: todaynew    时间: 2012-7-18 16:33
[attach]49699[/attach]

[attach]49700[/attach]
作者: 鱼儿游游    时间: 2012-7-18 22:52
t小宝 发表于 2012-7-18 15:44
搞不懂你什么意思,这个SQL语句不是很简单么。。。
Select CategoryID,CategoryLabel From 商品分类表 Whe ...

是要列出指定节点下的所有节点呀。
作者: 鱼儿游游    时间: 2012-7-18 22:55
todaynew 发表于 2012-7-18 16:33

多谢斑竹出手,但不能完全达到我的要求,因为,数据源是动态的。
作者: 鱼儿游游    时间: 2012-7-18 23:18
本帖最后由 鱼儿游游 于 2012-7-18 23:33 编辑

我现在的方法是用了临时表(LSB、LSB1):调用下面的过程(GetAllSub),生成的数据表LSB就是我要的结果。
我想实现:不用临时表,只用SQL语句也能得到同样结果的记录集。
  1. Sub test()
  2.     GetAllSub 2
  3. End Sub

  4. Public Sub GetAllSub(ByVal intParentID As Integer)
  5.     Dim strSQL    As String
  6.     Dim blnSaerch As Boolean
  7.     strSQL = "SELECT CategoryID,CategoryLabel INTO LSB FROM GoodsCategory WHERE ParentID=" + CStr(intParentID)
  8.     DoCmd.SetWarnings False
  9.     DoCmd.RunSQL strSQL
  10.    
  11.     blnSaerch = True
  12.     While blnSaerch
  13.         strSQL = "SELECT CategoryID,CategoryLabel INTO LSB1 FROM GoodsCategory WHERE ParentID IN (SELECT CategoryID FROM LSB) AND CategoryID NOT IN (SELECT CategoryID FROM LSB)"
  14.         DoCmd.RunSQL strSQL
  15.         If DCount("CategoryID", "LSB1") > 0 Then
  16.             strSQL = "INSERT INTO LSB (CategoryID,CategoryLabel) SELECT CategoryID,CategoryLabel FROM LSB1"
  17.             DoCmd.RunSQL strSQL
  18.         Else
  19.             blnSaerch = False
  20.         End If
  21.     Wend
  22. End Sub
复制代码

作者: yehf    时间: 2012-7-19 08:50
ParentID能不能重新进行定义呢?
作者: 鱼儿游游    时间: 2012-7-19 12:19
yehf 发表于 2012-7-19 08:50
ParentID能不能重新进行定义呢?

能。
作者: 风中漫步    时间: 2012-7-19 13:47
最终是想实现树结构?
作者: yehf    时间: 2012-7-19 13:59
既然可以重设ParentID,那么可以将 CategoryID为2的ParentID设为200-299,具体看数量,要3位还是4位.输入2,ParentID的条件就是Between 2*100 to 2*100+99
作者: 鱼儿游游    时间: 2012-7-19 14:06
yehf 发表于 2012-7-19 13:59
既然可以重设ParentID,那么可以将 CategoryID为2的ParentID设为200-299,具体看数量,要3位还是4位.输入2,Par ...

这样是可以,但不够灵活,我想只通过指定任一商品分类号,就能找到其下所有的分类。
作者: Henry D. Sy    时间: 2012-7-19 14:20
ParentID是不是缺点什么??
作者: yehf    时间: 2012-7-19 14:37
ParentID没规律和索引,怎么去建立标准呢?
作者: 鱼儿游游    时间: 2012-7-19 14:55
本帖最后由 鱼儿游游 于 2012-7-19 15:00 编辑
yehf 发表于 2012-7-19 14:37
ParentID没规律和索引,怎么去建立标准呢?


ParentID是没规律和索引的,只要是不重复的整型数字就行了。
因为,节点是可以增加、删除的,所以,ParentID的值是动态的不重复的整型数字。
作者: 鱼儿游游    时间: 2012-7-19 14:57
风中漫步 发表于 2012-7-19 13:47
最终是想实现树结构?

是的。
作者: todaynew    时间: 2012-7-19 20:28
鱼儿游游 发表于 2012-7-18 23:18
我现在的方法是用了临时表(LSB、LSB1):调用下面的过程(GetAllSub),生成的数据表LSB就是我要的结果。
我 ...

一回事,动态给数组赋值即可。
作者: 久999    时间: 2012-7-19 23:33
果然是很难啊
我也不是很清楚
还是不误人子弟
作者: 老鬼    时间: 2012-7-20 10:28
1.如果你非要用这种方法得到树结构,建议采用表间关联(见附件)。
2.如果你要采用树结构控件显示,建议改变原表设计,将ParentID与CategoryID合并,级与级间用位置表示:
比如:“商品管理”代码是“00”,“化妆品”代码用“0001”,依此类推。这样要采用树控件就很容易,用循环截取字符即可。
作者: 风中漫步    时间: 2012-7-20 13:12
请LZ说说最终目的.
作者: 鱼儿游游    时间: 2012-7-20 19:44
本帖最后由 鱼儿游游 于 2012-7-20 19:45 编辑
风中漫步 发表于 2012-7-20 13:12
请LZ说说最终目的.


最终目的是想实现树结构,而且节点能动态增加、删除、移动。
作者: 风中漫步    时间: 2012-7-21 12:49
鱼儿游游 发表于 2012-7-20 19:44
最终目的是想实现树结构,而且节点能动态增加、删除、移动。

不用临时表在treeview中实现节点分类装载?
作者: 鱼儿游游    时间: 2012-7-21 16:25
本帖最后由 鱼儿游游 于 2012-7-21 16:27 编辑
cuxun 发表于 2012-7-21 11:43
看示例是不是你要的.


多谢cuxun斑竹出手,你写的示例已达到我的要求,谢谢!
作者: 简    时间: 2012-7-22 15:42
我觉得好奇的是,如果是动态的增加删除移动,你如何知道节点的ParentID与CategoryID呢,莫非还要挨着查看呀。
作者: 心情如故    时间: 2015-3-15 00:00
select * from 商品分类表 where CategoryID in ( gt_AllDirIdSql(2) )为何查询为空?




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3