高分求一条SQL语句
我有一个表branch(branchid,branchname,parentid)部门表(部门编号,部门名称,父部门编号)有的部门有父部门,有的没有(可能有多级,比如D的...
我有一个表 branch(branchid,branchname,parentid)
部门表(部门编号,部门名称,父部门编号)
有的部门有父部门,有的没有(可能有多级,比如D的父部门是C,C的父部门是B,B的父部门是A)
另一个表 operator(operatorid,operatorname,branchid)
操作员表(编号,名字,所属部门ID)
现在我要查询属于某个部门以及该部门的所有孩子部门的操作员信息。。。
我要具体的答案 展开
部门表(部门编号,部门名称,父部门编号)
有的部门有父部门,有的没有(可能有多级,比如D的父部门是C,C的父部门是B,B的父部门是A)
另一个表 operator(operatorid,operatorname,branchid)
操作员表(编号,名字,所属部门ID)
现在我要查询属于某个部门以及该部门的所有孩子部门的操作员信息。。。
我要具体的答案 展开
8个回答
展开全部
如果是oracle , 就可以用1个查询语句完成。
用 start with ... connect by 语句。
具体写法是:
select level, branchid , branchname, parentid
from branch
start with branchid = 参数
connect by prior branchid = parentid
这样就可以查询你所给的部门ID以及他的下属所有部门,
将这个结果当作一个表, 用join语句就能实现。
select a.operatorid , a.operatorname, a.branchid ,b.branchname
from operator a , (select level, branchid , branchname, parentid
from branch
start with branchid = 参数
connect by prior branchid = parentid
) b
where a.branchid = b.branchid
如果你要的是ms-sql的话, 据我所知, 是不能用1条查询语句完成的。
你可以用store procedure, 用 游标(cursor)和循环来完成你所给的部门以及下所有属部门的查询,并存放到一个临时表里面。
并用这个结果,再用join语句实现, 这个方法比较麻烦。
当初设计表结构和部门代码结构的时候, 你应该实现想到这样的事情,
多加一个字段来表示他的级别, 或者部门代码采用
1000
1100
1101
1102
1200
1201
1202
这种结构, 那么做起来就不这么麻烦了。
用 start with ... connect by 语句。
具体写法是:
select level, branchid , branchname, parentid
from branch
start with branchid = 参数
connect by prior branchid = parentid
这样就可以查询你所给的部门ID以及他的下属所有部门,
将这个结果当作一个表, 用join语句就能实现。
select a.operatorid , a.operatorname, a.branchid ,b.branchname
from operator a , (select level, branchid , branchname, parentid
from branch
start with branchid = 参数
connect by prior branchid = parentid
) b
where a.branchid = b.branchid
如果你要的是ms-sql的话, 据我所知, 是不能用1条查询语句完成的。
你可以用store procedure, 用 游标(cursor)和循环来完成你所给的部门以及下所有属部门的查询,并存放到一个临时表里面。
并用这个结果,再用join语句实现, 这个方法比较麻烦。
当初设计表结构和部门代码结构的时候, 你应该实现想到这样的事情,
多加一个字段来表示他的级别, 或者部门代码采用
1000
1100
1101
1102
1200
1201
1202
这种结构, 那么做起来就不这么麻烦了。
展开全部
数据库设计有问题,导致现在操作起来很复杂,也不直观,更加影响效率。
如果可以更改数据库结构的话(不能改的话,可以搞张临时表用用),建议在branch表中增加一列LevelCode级次编码(该编码想必可以通过你的branchid处理下得到),编码形式为:
01
0101
0102
010201
01020101
.......
两位一级,这样在搜索父子部门时就可以很容易的使用模糊查询得到想要的所有部门,例如查找0102下的所有子部门,就可以是where like '0102%'。
如果可以更改数据库结构的话(不能改的话,可以搞张临时表用用),建议在branch表中增加一列LevelCode级次编码(该编码想必可以通过你的branchid处理下得到),编码形式为:
01
0101
0102
010201
01020101
.......
两位一级,这样在搜索父子部门时就可以很容易的使用模糊查询得到想要的所有部门,例如查找0102下的所有子部门,就可以是where like '0102%'。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
通过branchid查询
SELECT *
FROM operator
WHERE branchid =&id
OR branchid in (
SELECT branchid FROM branch WHERE parentid= &id);
通过branchname查询
SELECT *
FROM operator
WHERE branchid = (select branchid from branch bname = "name")
OR branchid in (select branchid from branch where parent in (
select branchid from branch where branchname = "name")
)
;
SELECT *
FROM operator
WHERE branchid =&id
OR branchid in (
SELECT branchid FROM branch WHERE parentid= &id);
通过branchname查询
SELECT *
FROM operator
WHERE branchid = (select branchid from branch bname = "name")
OR branchid in (select branchid from branch where parent in (
select branchid from branch where branchname = "name")
)
;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select x.所属部门,y.* from
(select branchid,branchname,(select branchname from branch where branchid=a.parentid) 所属部门 from branch a where parentid is not null) x,
operator y
where x.branchid=y.branchid;
(select branchid,branchname,(select branchname from branch where branchid=a.parentid) 所属部门 from branch a where parentid is not null) x,
operator y
where x.branchid=y.branchid;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select operator.*, branch.parentid from operator ,branch
where operator.branchid in
(
select a.branchid from branch a,branch b
where a.branchid = b.parentid
);
where operator.branchid in
(
select a.branchid from branch a,branch b
where a.branchid = b.parentid
);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这就是具体答案啊
create table branch
( branchid int ,
branchname varchar(40),
parentid int )
create table operator
( operatorid int ,
operatorname varchar(50),
branchid int )
insert into branch values(1,'a',null)
insert into branch values(2,'b',1)
insert into branch values(3,'c',2)
insert into branch values(4,'d',null)
insert into operator values(1,'lili',1)
insert into operator values(2,'zhuzhu',2)
insert into operator values(3,'haoyu',3)
insert into operator values(4,'liumei',4)
create table #tmp
( branchid int
)
insert into #tmp select branchid from branch where branchname = 'a'
declare @p_b_id int
set @p_b_id = (select * from #tmp)
declare @s_id int
set @s_id = (select branchid from branch where parentid = @p_b_id)
while (@s_id is not null)
begin
insert into #tmp values(@s_id)
set @p_b_id = @s_id
set @s_id = (select branchid from branch where parentid = @p_b_id)
end
select * from operator where branchid in (select * from #tmp)
根据 你的意思 我自己插入了几个数据 完整代码如上。你自己做的时候 根据自己原始表 来确定临时表的字段类型。把insert into #tmp select branchid from branch where branchname = 'a' 这句中的‘a’改成 你要找的部门名字。
declare @p_b_id int
set @p_b_id = (select * from #tmp)
declare @s_id int
set @s_id = (select branchid from branch where parentid = @p_b_id)
while (@s_id is not null)
begin
insert into #tmp values(@s_id)
set @p_b_id = @s_id
set @s_id = (select branchid from branch where parentid = @p_b_id)
end
这一段 要一起执行 不能分开执行
create table branch
( branchid int ,
branchname varchar(40),
parentid int )
create table operator
( operatorid int ,
operatorname varchar(50),
branchid int )
insert into branch values(1,'a',null)
insert into branch values(2,'b',1)
insert into branch values(3,'c',2)
insert into branch values(4,'d',null)
insert into operator values(1,'lili',1)
insert into operator values(2,'zhuzhu',2)
insert into operator values(3,'haoyu',3)
insert into operator values(4,'liumei',4)
create table #tmp
( branchid int
)
insert into #tmp select branchid from branch where branchname = 'a'
declare @p_b_id int
set @p_b_id = (select * from #tmp)
declare @s_id int
set @s_id = (select branchid from branch where parentid = @p_b_id)
while (@s_id is not null)
begin
insert into #tmp values(@s_id)
set @p_b_id = @s_id
set @s_id = (select branchid from branch where parentid = @p_b_id)
end
select * from operator where branchid in (select * from #tmp)
根据 你的意思 我自己插入了几个数据 完整代码如上。你自己做的时候 根据自己原始表 来确定临时表的字段类型。把insert into #tmp select branchid from branch where branchname = 'a' 这句中的‘a’改成 你要找的部门名字。
declare @p_b_id int
set @p_b_id = (select * from #tmp)
declare @s_id int
set @s_id = (select branchid from branch where parentid = @p_b_id)
while (@s_id is not null)
begin
insert into #tmp values(@s_id)
set @p_b_id = @s_id
set @s_id = (select branchid from branch where parentid = @p_b_id)
end
这一段 要一起执行 不能分开执行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询