SQL递归查询所有子节点 30

一个n层结构的数据表:categoriesid:目录ID,upid:上级目录ID,name:目录名称-----------------------------------... 一个n层结构的数据表:categories
id: 目录ID,upid: 上级目录ID,name: 目录名称
----------------------------------------
id upid name
----------------------------------------
1 0 中国
2 0 美国
3 1 广东
4 3 深圳
5 2 华盛顿州
6 5 纽约
7 1 上海
......
-----------------------------------------
通过SQL查询出来的结果:
-----------------------------------------
中国 -> 广东 -> 深圳
中国 -> 上海
美国 -> 华盛顿州 -> 纽约
这是道外资企业的试题,原题是英文的,必须用SQL实现,如果广东下面有东莞,是要再从中国开始另起一个分支,大家能给出这种横向结构也行
展开
 我来答
衣霁YT
2010-07-13 · 超过10用户采纳过TA的回答
知道答主
回答量:29
采纳率:0%
帮助的人:23.7万
展开全部
你这样设计的表用递归来显示最恰当 我刚刚好有这个的代码 发给你参考下吧
/// <summary>
/// 绑定根节点
/// </summary>
/// <param name="id"></param>
/// <param name="ddlList"></param>
public void BindSysMenu(string id, DropDownList ddlList)
{
ListItem ll = new ListItem();
ll.Text = "╋--请选择-----";
ll.Value = "-1";
ddlList.Items.Add(ll);
DataTable dt = new ManageContentInfoBll().GetWName(id).Tables[0];
foreach (DataRow dr in dt.Rows)
{
ListItem li = new ListItem();
li.Text = "╋" + dr["W_Name"].ToString();
li.Value = dr["W_ID"].ToString();
ddlList.Items.Add(li);
BindSysMenuChild((dr["W_ID"].ToString()), ddlList, "├—");
}
}

/// <summary>
/// 绑定子节点
/// </summary>
public void BindSysMenuChild(string id, DropDownList ddlList, String separtor)
{
DataTable dt = new ManageContentInfoBll().GetWName(id).Tables[0];
foreach (DataRow dr in dt.Rows)
{
ListItem li = new ListItem();
li.Text = separtor + dr["W_Name"].ToString();
li.Value = dr["W_ID"].ToString();
string separtor_ = separtor + "——";
ddlList.Items.Add(li);
BindSysMenuChild(dr["W_ID"].ToString(), ddlList, separtor_);
}

}
sql 语句 很简单的
select * from WebSubjectMenu where W_Logo ="+id+"
W_Logo 是上级的ID
希望对你有帮助吧。
百度网友6a7d11453
2010-07-13 · TA获得超过954个赞
知道小有建树答主
回答量:931
采纳率:50%
帮助的人:714万
展开全部
select t1.name as name1, t2.name as name2, t3.name as name3 from categories as t1 left join categories as t2 on t1.id=t2.upid left join categories as t3 on t2.id=t3.upid where t1.upid=0

这样写有一个缺点 就是你必须知道有几层关系 就套几个表
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友ddd0aca8b
2010-07-13 · TA获得超过176个赞
知道小有建树答主
回答量:178
采纳率:0%
帮助的人:144万
展开全部
select name from categories start with upid=0
connect by prior id =upid
这样应该会显示:
中国
广东
深圳
上海
美国
华盛顿州
纽约

感觉你的设计有点小问题。如果广东下面再来个东莞,你显示成啥样?还从中国开始,重新起一个分支吗?
最好还是不要通过sql查出横向的结果来。
直接纵向查出来,后续处理时,根据需要显示成树或者别的格式即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
候诗吕波涛
2020-04-25 · TA获得超过3888个赞
知道大有可为答主
回答量:3164
采纳率:25%
帮助的人:484万
展开全部
你这样设计的表用递归来显示最恰当
我刚刚好有这个的代码
发给你参考下吧
///
<summary>
///
绑定根节点
///
</summary>
///
<param
name="id"></param>
///
<param
name="ddlList"></param>
public
void
BindSysMenu(string
id,
DropDownList
ddlList)
{
ListItem
ll
=
new
ListItem();
ll.Text
=
"╋--请选择-----";
ll.Value
=
"-1";
ddlList.Items.Add(ll);
DataTable
dt
=
new
ManageContentInfoBll().GetWName(id).Tables[0];
foreach
(DataRow
dr
in
dt.Rows)
{
ListItem
li
=
new
ListItem();
li.Text
=
"╋"
+
dr["W_Name"].ToString();
li.Value
=
dr["W_ID"].ToString();
ddlList.Items.Add(li);
BindSysMenuChild((dr["W_ID"].ToString()),
ddlList,
"├-");
}
}
///
<summary>
///
绑定子节点
///
</summary>
public
void
BindSysMenuChild(string
id,
DropDownList
ddlList,
String
separtor)
{
DataTable
dt
=
new
ManageContentInfoBll().GetWName(id).Tables[0];
foreach
(DataRow
dr
in
dt.Rows)
{
ListItem
li
=
new
ListItem();
li.Text
=
separtor
+
dr["W_Name"].ToString();
li.Value
=
dr["W_ID"].ToString();
string
separtor_
=
separtor
+
"--";
ddlList.Items.Add(li);
BindSysMenuChild(dr["W_ID"].ToString(),
ddlList,
separtor_);
}
}
sql
语句
很简单的
select
*
from
WebSubjectMenu
where
W_Logo
="+id+"
W_Logo
是上级的ID
希望对你有帮助吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式