日期:2014-05-16  浏览次数:20530 次

求一个sql, 级联查询
表(行业表)主要字段是这样的:
id code name parent_code;
parent_code关联表中另外一个数据的code字段
数据:
1,'A','农、林、牧、渔业',null;
2,'1',‘农业’,'A';
parent_code=null 表示是最高级别(无父级)
从业务上理解, id=1这个行业是 id=2(农业)的父级,  id=2 可能又是其它行业的父级, 整张表父子层次比较深
农、林、牧、渔业->农业->谷物种植->豆类种植 ...

我要做这样一个查询: 给你任意一个行业id,查询该行业及其所有子行业
若id=1,则结果
农、林、牧、渔业 + (农业,林业,畜牧业,渔业) +(谷物种植,水果种植,中药材种植,...)+(....) +...

求帮助, 不知道sql能不能实现

------解决方案--------------------
BOM结构 论坛N多 。

-- 建立演示环境
CREATE TABLE Dept(
 id int PRIMARY KEY, 
 parent_id int,
 name nvarchar(20))
INSERT Dept
SELECT 0, 0, N'<全部>' UNION ALL
SELECT 1, 0, N'财务部' UNION ALL
SELECT 2, 0, N'行政部' UNION ALL
SELECT 3, 0, N'业务部' UNION ALL
SELECT 4, 0, N'业务部' UNION ALL
SELECT 5, 4, N'销售部' UNION ALL
SELECT 6, 4, N'MIS' UNION ALL
SELECT 7, 6, N'UI' UNION ALL
SELECT 8, 6, N'软件开发' UNION ALL
SELECT 9, 8, N'内部开发'
GO

-- 查询指定部门下面的所有部门
DECLARE @Dept_name nvarchar(20)
SET @Dept_name = N'MIS'
;WITH
DEPTS AS(
 -- 定位点成员
 SELECT * FROM Dept
 WHERE name = @Dept_name
 UNION ALL
 -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
 SELECT A.*
 FROM Dept A, DEPTS B
 WHERE A.parent_id = B.id
)
SELECT * FROM DEPTS
GO

-- 删除演示环境
DROP TABLE Dept

------解决方案--------------------
把上面版主的代码修改了一下,去掉了变量:

建表语句

-- 建立演示环境
CREATE TABLE Dept(
 id int PRIMARY KEY, 
 parent_id int,
 name nvarchar(20))
 
INSERT Dept
SELECT 0, 0, N'<全部>' UNION ALL
SELECT 1, 0, N'财务部' UNION ALL
SELECT 2, 0, N'行政部' UNION ALL
SELECT 3, 0, N'业务部' UNION ALL
SELECT 4, 0, N'业务部' UNION ALL
SELECT 5, 4, N'销售部' UNION ALL
SELECT 6, 4, N'MIS' UNION ALL
SELECT 7, 6, N'UI' UNION ALL
SELECT 8, 6, N'软件开发' UNION ALL
SELECT 9, 8, N'内部开发'
GO


查询:


;WITH
DEPTS AS(
 -- 定位点成员
 SELECT * FROM Dept
 WHERE name = N'MIS'
 UNION ALL
 -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
 SELECT A.*
 FROM Dept A, DEPTS B
 WHERE A.parent_id = B.id
)
SELECT * FROM DEPTS


------解决方案--------------------
引用:
Quote: 引用:


WITH temp AS(
 -- 定位点成员
 SELECT * FROM industry
 WHERE id = 7567
 UNION ALL
 -- 递归成员, 通过引用CTE