求一个级联的查询的sql

Persistence_x 2013-12-09 05:11:16
顾客表
Cusno CusName Cus_deptId CusTel
1 zjf 4 13
2 xdx 6 sss
部门表
DeptId Name_cn ParentId Phone
1 AA公司 0 111111
2 研发 1 22222
3 测试部 1 333
4 测试1 3 aaa
5 研发1 2 啊啊
6 研发2 2 bb
7 研发3 2 ss
8 测试2 3 ssss

我要查询一下
cusno cusname cus_deptid custel 还要一列
1 zjf 4 1111 AA公司/测试部/测试1
2 xdx 6 sss AA公司/研发/研发2

请大神帮忙看看
...全文
265 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-12-10
  • 打赏
  • 举报
回复
这种有父子关系的查询除了用函数、循环、CTE这些技术,其他技术貌似搞不定
Persistence_x 2013-12-10
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
t-sql可以,SQLCE我就不会了
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-09 17:15:01
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[顾客表]
if object_id('[顾客表]') is not null drop table [顾客表]
go 
create table [顾客表]([Cusno] int,[CusName] varchar(3),[Cus_deptId] int,[CusTel] varchar(3))
insert [顾客表]
select 1,'zjf',4,'13' union all
select 2,'xdx',6,'sss'
--> 测试数据:[部门表]
if object_id('[部门表]') is not null drop table [部门表]
go 
create table [部门表]([deptid] int,[name_cn] varchar(18),[parentid] int)
insert [部门表]
select 1,'北京AAA汇杰',0 union all
select 2,'研发/北京AAA汇',1 union all
select 3,'测试部/北京AAA汇',1 union all
select 4,'测试1/测试部/北',3 union all
select 8,'测试2/测试部/北',3 union all
select 9,'测试小组1/测试2/测',8 union all
select 10,'测试小组2/测试2/测',8 union all
select 5,'研发1/研发/北京',2 union all
select 6,'研发2/研发/北京',2 union all
select 7,'研发3/研发/北京',2
--------------开始查询--------------------------
;WITH cte AS (
select deptid,CONVERT(VARCHAR(MAX),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT  a.deptid,CONVERT(VARCHAR(MAX),a.name_cn)+'/'+CONVERT(VARCHAR(MAX),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid
 
)
SELECT deptid,name_cn
 FROM cte
 WHERE deptid=10
--select a.*,b.name_cn
--from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid

 
----------------结果----------------------------
/* 
deptid      name_cn
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10          测试小组2/测试2/测/测试2/测试部/北/测试部/北京AAA汇/北京AAA汇杰   
*/
这个用t_sql不创建临时结果集的一个sql能实现吗! 类似于子查询的,因为我想要的是单独的一个sql 丢到ce里面就可以了 他会自动转换的。
發糞塗牆 2013-12-10
  • 打赏
  • 举报
回复
t-sql可以,SQLCE我就不会了
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-09 17:15:01
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--    Dec 28 2012 20:23:12 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[顾客表]
if object_id('[顾客表]') is not null drop table [顾客表]
go 
create table [顾客表]([Cusno] int,[CusName] varchar(3),[Cus_deptId] int,[CusTel] varchar(3))
insert [顾客表]
select 1,'zjf',4,'13' union all
select 2,'xdx',6,'sss'
--> 测试数据:[部门表]
if object_id('[部门表]') is not null drop table [部门表]
go 
create table [部门表]([deptid] int,[name_cn] varchar(18),[parentid] int)
insert [部门表]
select 1,'北京AAA汇杰',0 union all
select 2,'研发/北京AAA汇',1 union all
select 3,'测试部/北京AAA汇',1 union all
select 4,'测试1/测试部/北',3 union all
select 8,'测试2/测试部/北',3 union all
select 9,'测试小组1/测试2/测',8 union all
select 10,'测试小组2/测试2/测',8 union all
select 5,'研发1/研发/北京',2 union all
select 6,'研发2/研发/北京',2 union all
select 7,'研发3/研发/北京',2
--------------开始查询--------------------------
;WITH cte AS (
select deptid,CONVERT(VARCHAR(MAX),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT  a.deptid,CONVERT(VARCHAR(MAX),a.name_cn)+'/'+CONVERT(VARCHAR(MAX),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid
 
)
SELECT deptid,name_cn
 FROM cte
 WHERE deptid=10
--select a.*,b.name_cn
--from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid

 
----------------结果----------------------------
/* 
deptid      name_cn
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10          测试小组2/测试2/测/测试2/测试部/北/测试部/北京AAA汇/北京AAA汇杰   
*/
Persistence_x 2013-12-10
  • 打赏
  • 举报
回复
引用 17 楼 DBA_Huangzj 的回复:
没搞C#好多年了,已经不记得了...要不你先到网上找找SQLCE有没有方法实现递归,如果没有,就去C#版问问
DeptId Name_cn ParentId Phone 1 北京AAA汇杰 0 111111 2 研发 1 22222 3 测试部 1 333 4 测试1 3 aaa 5 研发1 2 啊啊 6 研发2 2 bb 7 研发3 2 ss 8 测试2 3 ssss 9 测试小组1 8 搜索 10 测试小组2 8 搜索三 这个表单条子查询可以根据id是10的 然后返回北京AAA汇杰/测试部/测试2/测试小组2 这个语句吗?
發糞塗牆 2013-12-10
  • 打赏
  • 举报
回复
没搞C#好多年了,已经不记得了...要不你先到网上找找SQLCE有没有方法实现递归,如果没有,就去C#版问问
Persistence_x 2013-12-10
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
CTE的确不支持SQLCE...T-SQL很多语句SQLCE都不能用,你要么用CLR那些来实现
那请问一下 CLR怎么来实现. 不知道版主对这块了解吗,就是之前的这个需求!
發糞塗牆 2013-12-10
  • 打赏
  • 举报
回复
恭喜,顺带一下》。。。接的结贴
Persistence_x 2013-12-10
  • 打赏
  • 举报
回复
引用 21 楼 DBA_Huangzj 的回复:
这种有父子关系的查询除了用函数、循环、CTE这些技术,其他技术貌似搞不定
我在程序里用递归实现了 已经搞定 谢谢!
發糞塗牆 2013-12-09
  • 打赏
  • 举报
回复
CTE的确不支持SQLCE...T-SQL很多语句SQLCE都不能用,你要么用CLR那些来实现
Persistence_x 2013-12-09
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
用8楼的,下班了
你好,这种临时结果集的在sqlce下好像不能支持的
Persistence_x 2013-12-09
  • 打赏
  • 举报
回复
你好,这种临时结果集的在sqlce下好像不能支持的
引用 12 楼 yupeigu 的回复:
用的cte递归查询来实现,正解
LongRui888 2013-12-09
  • 打赏
  • 举报
回复
用的cte递归查询来实现,正解
Persistence_x 2013-12-09
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
直接用MAX算了
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-09 17:15:01
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[顾客表]
if object_id('[顾客表]') is not null drop table [顾客表]
go 
create table [顾客表]([Cusno] int,[CusName] varchar(3),[Cus_deptId] int,[CusTel] varchar(3))
insert [顾客表]
select 1,'zjf',4,'13' union all
select 2,'xdx',6,'sss'
--> 测试数据:[部门表]
if object_id('[部门表]') is not null drop table [部门表]
go 
create table [部门表]([deptid] int,[name_cn] varchar(18),[parentid] int)
insert [部门表]
select 1,'北京AAA汇杰',0 union all
select 2,'研发/北京AAA汇',1 union all
select 3,'测试部/北京AAA汇',1 union all
select 4,'测试1/测试部/北',3 union all
select 8,'测试2/测试部/北',3 union all
select 9,'测试小组1/测试2/测',8 union all
select 10,'测试小组2/测试2/测',8 union all
select 5,'研发1/研发/北京',2 union all
select 6,'研发2/研发/北京',2 union all
select 7,'研发3/研发/北京',2
--------------开始查询--------------------------
;WITH cte AS (
select deptid,CONVERT(VARCHAR(MAX),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT a.deptid,CONVERT(VARCHAR(MAX),a.name_cn)+'/'+CONVERT(VARCHAR(MAX),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid)
--SELECT deptid,name_cn
-- FROM cte
select a.*,b.name_cn
from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid

----------------结果----------------------------
/* 
Cusno       CusName Cus_deptId  CusTel name_cn
----------- ------- ----------- ------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1           zjf     4           13     测试1/测试部/北/测试部/北京AAA汇/北京AAA汇杰                
2           xdx     6           sss    研发2/研发/北京/研发/北京AAA汇/北京AAA汇杰    

*/
不好意思 是我数据库表字段写的小 不好意思.我回家在嘀咕一下,完事结贴
發糞塗牆 2013-12-09
  • 打赏
  • 举报
回复
用8楼的,下班了
Persistence_x 2013-12-09
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
长度问题,你试试,我这个本来就不是固定下属的
;WITH cte AS (
select deptid,CONVERT(VARCHAR(100),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT a.deptid,CONVERT(VARCHAR(90),a.name_cn)+'/'+CONVERT(VARCHAR(9),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid)
--SELECT deptid,name_cn
-- FROM cte
select a.*,b.name_cn
from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid
--我看了一下,但是我这个name_cn显示的长度 我怎么让他扩大点,我现在该varchar里面的值 总是报错 消息 240,级别 16,状态 1,第 1 行 在递归查询 "cte" 的列 "name_cn" 中,定位点类型和递归部分的类型不匹配。
發糞塗牆 2013-12-09
  • 打赏
  • 举报
回复
直接用MAX算了
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-09 17:15:01
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[顾客表]
if object_id('[顾客表]') is not null drop table [顾客表]
go 
create table [顾客表]([Cusno] int,[CusName] varchar(3),[Cus_deptId] int,[CusTel] varchar(3))
insert [顾客表]
select 1,'zjf',4,'13' union all
select 2,'xdx',6,'sss'
--> 测试数据:[部门表]
if object_id('[部门表]') is not null drop table [部门表]
go 
create table [部门表]([deptid] int,[name_cn] varchar(18),[parentid] int)
insert [部门表]
select 1,'北京AAA汇杰',0 union all
select 2,'研发/北京AAA汇',1 union all
select 3,'测试部/北京AAA汇',1 union all
select 4,'测试1/测试部/北',3 union all
select 8,'测试2/测试部/北',3 union all
select 9,'测试小组1/测试2/测',8 union all
select 10,'测试小组2/测试2/测',8 union all
select 5,'研发1/研发/北京',2 union all
select 6,'研发2/研发/北京',2 union all
select 7,'研发3/研发/北京',2
--------------开始查询--------------------------
;WITH cte AS (
select deptid,CONVERT(VARCHAR(MAX),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT a.deptid,CONVERT(VARCHAR(MAX),a.name_cn)+'/'+CONVERT(VARCHAR(MAX),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid)
--SELECT deptid,name_cn
-- FROM cte
select a.*,b.name_cn
from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid

----------------结果----------------------------
/* 
Cusno       CusName Cus_deptId  CusTel name_cn
----------- ------- ----------- ------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1           zjf     4           13     测试1/测试部/北/测试部/北京AAA汇/北京AAA汇杰                
2           xdx     6           sss    研发2/研发/北京/研发/北京AAA汇/北京AAA汇杰    

*/
發糞塗牆 2013-12-09
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-12-09 17:15:01
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[顾客表]
if object_id('[顾客表]') is not null drop table [顾客表]
go 
create table [顾客表]([Cusno] int,[CusName] varchar(3),[Cus_deptId] int,[CusTel] varchar(3))
insert [顾客表]
select 1,'zjf',4,'13' union all
select 2,'xdx',6,'sss'
--> 测试数据:[部门表]
if object_id('[部门表]') is not null drop table [部门表]
go 
create table [部门表]([deptid] int,[name_cn] varchar(18),[parentid] int)
insert [部门表]
select 1,'北京AAA汇杰',0 union all
select 2,'研发/北京AAA汇',1 union all
select 3,'测试部/北京AAA汇',1 union all
select 4,'测试1/测试部/北',3 union all
select 8,'测试2/测试部/北',3 union all
select 9,'测试小组1/测试2/测',8 union all
select 10,'测试小组2/测试2/测',8 union all
select 5,'研发1/研发/北京',2 union all
select 6,'研发2/研发/北京',2 union all
select 7,'研发3/研发/北京',2
--------------开始查询--------------------------
;WITH cte AS (
select deptid,CONVERT(VARCHAR(100),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT a.deptid,CONVERT(VARCHAR(50),a.name_cn)+'/'+CONVERT(VARCHAR(49),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid)
--SELECT deptid,name_cn
-- FROM cte
select a.*,b.name_cn
from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid

----------------结果----------------------------
/* 
Cusno       CusName Cus_deptId  CusTel name_cn
----------- ------- ----------- ------ ----------------------------------------------------------------------------------------------------
1           zjf     4           13     测试1/测试部/北/测试部/北京AAA汇/北京AAA汇杰
2           xdx     6           sss    研发2/研发/北京/研发/北京AAA汇/北京AAA汇杰

*/
發糞塗牆 2013-12-09
  • 打赏
  • 举报
回复
长度问题,你试试,我这个本来就不是固定下属的
;WITH cte AS (
select deptid,CONVERT(VARCHAR(100),name_cn)name_cn,parentid
from [部门表]
WHERE parentid=0
UNION ALL 
SELECT a.deptid,CONVERT(VARCHAR(90),a.name_cn)+'/'+CONVERT(VARCHAR(9),b.name_cn) name_cn,a.parentid
FROM [部门表] a INNER JOIN cte b ON a.parentid=b.deptid)
--SELECT deptid,name_cn
-- FROM cte
select a.*,b.name_cn
from [顾客表] a INNER JOIN cte b ON a.[Cus_deptId]=b.deptid
Persistence_x 2013-12-09
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
CTE是一个临时数据集,但是用完自动消失,是为了辅助合并你那个/,直接执行没问题啊
deptid name_cn parentid 1 北京AAA汇杰 0 2 研发/北京AAA汇 1 3 测试部/北京AAA汇 1 4 测试1/测试部/北 3 8 测试2/测试部/北 3 9 测试小组1/测试2/测 8 10 测试小组2/测试2/测 8 5 研发1/研发/北京 2 6 研发2/研发/北京 2 7 研发3/研发/北京 2 --版主 --第一 目前这个问题 显示的不完整, --第二 因为下面的部门 可能是很多下属 不固定 Cusno CusName Cus_deptId CusTel name_cn 1 zjf 4 1111 测试1/测试部/北 3 wg 9 ss 测试小组1/测试2/测 2 xdx 6 sss 研发2/研发/北京
發糞塗牆 2013-12-09
  • 打赏
  • 举报
回复
CTE是一个临时数据集,但是用完自动消失,是为了辅助合并你那个/,直接执行没问题啊
加载更多回复(3)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧