现在有一张表
PARENT_CD CHILD_CD SQ Name
10CAAAA 30CAAAA 1 AA
10CAAAA AAAA 2 BB
10CAAAA AAAA 3 CC
10CAAAA AAAA 4 DD
30CAAAA 70CAAAA 1 EE
30CAAAA BBBB 2 FF
30CAAAA BBBB 3 GG
70CAAAA CCCC 1 HH
70CAAAA CCCC 2 JJ
70CAAAA CCCC 3 KK
现在想要得带这样的结果:
属于10CAAAA 编号下的所有子编号,但是30C 70C 不要显示,只显示他下面的子编号
就是:
CHILD_CD SQ Name
AAAA 2 BB
AAAA 3 CC
AAAA 4 DD
BBBB 2 FF
BBBB 3 GG
CCCC 1 HH
CCCC 2 JJ
CCCC 3 KK
PARENT_CD CHILD_CD SQ Name
10CAAAA 30CAAAA 1 AA
10CAAAA AAAA 2 BB
10CAAAA AAAA 3 CC
10CAAAA AAAA 4 DD
30CAAAA 70CAAAA 1 EE
30CAAAA BBBB 2 FF
30CAAAA BBBB 3 GG
70CAAAA CCCC 1 HH
70CAAAA CCCC 2 JJ
70CAAAA CCCC 3 KK
现在想要得带这样的结果:
属于10CAAAA 编号下的所有子编号,但是30C 70C 不要显示,只显示他下面的子编号
就是:
CHILD_CD SQ Name
AAAA 2 BB
AAAA 3 CC
AAAA 4 DD
BBBB 2 FF
BBBB 3 GG
CCCC 1 HH
CCCC 2 JJ
CCCC 3 KK
解决方案 »
- sql 服务管理器的问题
- SQL 2005 求助
- SQL的基础用法
- northwind中查提供商品最多的国家
- 用什么SQL语句可以把一张表的各字段名,类型,字段解释(Description)这三项显示出来
- 如何建立远程服务器
- SQL Server 2000 内网连接成功,外网连接不通??
- 寻求客户端不安装SQLSERVER而进行DTS调用的解决办法
- 关于删除表中指定行数以后的记录的操作
- 关于sql server 部署问题
- 安装SQL server 2008 R2 出现了一个小错误,求解析
- Syntax error converting the varchar value '' 'to a column of data type int
when c.child_cd is null and b.child_cd is not null then b.child_cd
when c.child_cd is null and b.child_cd is null then a.child_cd
end)child_cd
,(case when c.child_cd is not null then c.sq
when c.child_cd is null and b.child_cd is not null then b.sq
when c.child_cd is null and b.child_cd is null then a.sq
end)sq
,(case when c.child_cd is not null then c.name
when c.child_cd is null and b.child_cd is not null then b.name
when c.child_cd is null and b.child_cd is null then a.name
end)name
from tb a
left join tb b on a.child_cd = b.parent_cd
left join tb c on b.child_cd = c.parent_cd
where a.parent_cd = '10caaa'
USE tempdb
GO-- 建立演示环境
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----CTE的综合应用USE tempdb
GO-- 建立演示环境
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
),
DEPTCHILD AS( -- 引用第1个CTE,查询其每条记录对应的部门下的所有子部门
SELECT
Dept_id = P.id, C.id, C.parent_id
FROM DEPTS P, Dept C
WHERE P.id = C.parent_id
UNION ALL
SELECT
P.Dept_id, C.id, C.parent_id
FROM DEPTCHILD P, Dept C
WHERE P.id = C.parent_id
),
DEPTCHILDCNT AS( -- 引用第2个CTE, 汇总得到各部门下的子部门数
SELECT
Dept_id, Cnt = COUNT(*)
FROM DEPTCHILD
GROUP BY Dept_id
)
SELECT -- JOIN第1,3个CTE,得到最终的查询结果
D.*,
ChildDeptCount = ISNULL(DS.Cnt, 0)
FROM DEPTS D
LEFT JOIN DEPTCHILDCNT DS
ON D.id = DS.Dept_id
GO-- 删除演示环境
DROP TABLE Dept
e]
create table t1
(
pid varchar(10),
cid varchar(10),
sq int,
name varchar(2)
)
insert into t1
select '10CAAAA', '30CAAAA', 1, 'AA' union all
select '10CAAAA', 'AAAA', 2, 'BB' union all
select '10CAAAA', 'AAAA', 3, 'CC' union all
select '10CAAAA', 'AAAA', 4, 'DD' union all
select '30CAAAA', '70CAAAA', 1, 'EE' union all
select '30CAAAA', 'BBBB', 2, 'FF' union all
select '30CAAAA', 'BBBB', 3, 'GG' union all
select '70CAAAA', 'CCCC', 1, 'HH' union all
select '70CAAAA', 'CCCC', 2, 'JJ' union all
select '70CAAAA', 'CCCC', 3, 'KK'
select * from t1;with aaa as
(
select * from t1 where pid='10CAAAA'
union all
select a.* from t1 as a inner join aaa as b on a.pid=b.cid
)
select cid,sq,name from aaa where LEN(cid)<5------------------------------
cid sq name
AAAA 2 BB
AAAA 3 CC
AAAA 4 DD
BBBB 2 FF
BBBB 3 GG
CCCC 1 HH
CCCC 2 JJ
CCCC 3 KK