请问各位大侠,这个sql怎么写呢?多谢
部门ID,ID,boss_IDA1A21A32A42B51B65B75C81C98C108输入员工id,要把部门显示出来,而且当输入id=1的时候,要把所有部门都显示出来...
部门ID, ID, boss_ID
A 1
A 2 1
A 3 2
A 4 2
B 5 1
B 6 5
B 7 5
C 8 1
C 9 8
C 10 8
输入员工id,要把部门显示出来,
而且当输入id=1的时候,要把所有部门都显示出来,这个sql句子怎么写呢?
能解决的话追加悬赏 展开
A 1
A 2 1
A 3 2
A 4 2
B 5 1
B 6 5
B 7 5
C 8 1
C 9 8
C 10 8
输入员工id,要把部门显示出来,
而且当输入id=1的时候,要把所有部门都显示出来,这个sql句子怎么写呢?
能解决的话追加悬赏 展开
5个回答
展开全部
这个是典型的自连接表,具体到这个问题上,就是一个员工表,很显然三级结构一块放在这里了,也就是说,id=1的员工没有上级,统管了三个部门,而boss_ID为1的则是中层管理人员,历属于id=1的员工,而低层人员的boss_ID就是中层人员.
想要实现的是根据员工ID显示部门号ID,但这里也出一个问题,那就是id为1的员工不应该属性A部门.这个是E_R实体模型转换时的考虑不周.
但问题的解决似乎非常简单,只不过是一个相关的部门显示而已.事实上的在确如此.
select 部门ID from tablename where ID=@id or boss_id = @id
这句话的意思是显示员工所在或理所辖部门的ID号!在实体模型中,数据库设计人员认为老板是属性A部门的,与老板属于多所有部门的产生了一个小小的分歧问题.当然这是一个模据库设计范畴的问题,不影响实现的使用.但由于分析错会产生一句无用的东西,就是select 部门ID from tablename where ID = 1时的无谓结果.你永远可能都不会用到,也是永远不用知道老板属于哪个部门或是所在部门!虽然他跟现实中十分接近,老板在某个部门要职,但对于数据库设计来说他却是多余的信息而毫无用处!一楼的还处于课本知识?语句写的不要太长了,有时除了会影响性能外,也是没有多大用处的!
想要实现的是根据员工ID显示部门号ID,但这里也出一个问题,那就是id为1的员工不应该属性A部门.这个是E_R实体模型转换时的考虑不周.
但问题的解决似乎非常简单,只不过是一个相关的部门显示而已.事实上的在确如此.
select 部门ID from tablename where ID=@id or boss_id = @id
这句话的意思是显示员工所在或理所辖部门的ID号!在实体模型中,数据库设计人员认为老板是属性A部门的,与老板属于多所有部门的产生了一个小小的分歧问题.当然这是一个模据库设计范畴的问题,不影响实现的使用.但由于分析错会产生一句无用的东西,就是select 部门ID from tablename where ID = 1时的无谓结果.你永远可能都不会用到,也是永远不用知道老板属于哪个部门或是所在部门!虽然他跟现实中十分接近,老板在某个部门要职,但对于数据库设计来说他却是多余的信息而毫无用处!一楼的还处于课本知识?语句写的不要太长了,有时除了会影响性能外,也是没有多大用处的!
展开全部
select a.部门id from (select 部门id from 表) a left join (select * from 表 where id=1) b on a.部门id=b.部门id
结果将是:
A 1
B
C
只有部门A中有其它数据,其它部门无数据
结果将是:
A 1
B
C
只有部门A中有其它数据,其它部门无数据
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建立测试表
SQL> CREATE TABLE test_djh (
2 dept_id varchar(2),
3 id int,
4 boss_id int
5 );
Table created.
建立测试数据
SQL> INSERT INTO test_djh VALUES('A', 1, NULL);
1 row created.
SQL> INSERT INTO test_djh VALUES('A', 2, 1);
1 row created.
SQL> INSERT INTO test_djh VALUES('A', 3, 2);
1 row created.
SQL> INSERT INTO test_djh VALUES('A', 4, 2);
1 row created.
SQL> INSERT INTO test_djh VALUES('B', 5, 1);
1 row created.
SQL> INSERT INTO test_djh VALUES('B', 6, 5);
1 row created.
SQL> INSERT INTO test_djh VALUES('B', 7, 5);
1 row created.
SQL> INSERT INTO test_djh VALUES('C', 8, 1);
1 row created.
SQL> INSERT INTO test_djh VALUES('C', 9, 8);
1 row created.
SQL> INSERT INTO test_djh VALUES('C', 10, 8);
1 row created.
-- 查询语句测试
SQL> SELECT
2 dept_id
3 FROM
4 test_djh
5 WHERE
6 id = 1
7 UNION
8 SELECT
9 dept_id
10 FROM
11 test_djh
12 WHERE
13 boss_id = 1;
DEPT
----
A
B
C
SQL>
SQL> SELECT
2 dept_id
3 FROM
4 test_djh
5 WHERE
6 id = 2
7 UNION
8 SELECT
9 dept_id
10 FROM
11 test_djh
12 WHERE
13 boss_id = 2
14 ;
DEPT
----
A
SQL>
----------------------
总结:
就是把自己这个部门 UNION 自己是BOSS的部门
UNION 关键字,过滤掉重复的记录
注意,以上 SQL,仅仅适用于 2层 组织体系结构的。
有3层以上组织体系结构的, SQL语句需要适当修改。
SQL> CREATE TABLE test_djh (
2 dept_id varchar(2),
3 id int,
4 boss_id int
5 );
Table created.
建立测试数据
SQL> INSERT INTO test_djh VALUES('A', 1, NULL);
1 row created.
SQL> INSERT INTO test_djh VALUES('A', 2, 1);
1 row created.
SQL> INSERT INTO test_djh VALUES('A', 3, 2);
1 row created.
SQL> INSERT INTO test_djh VALUES('A', 4, 2);
1 row created.
SQL> INSERT INTO test_djh VALUES('B', 5, 1);
1 row created.
SQL> INSERT INTO test_djh VALUES('B', 6, 5);
1 row created.
SQL> INSERT INTO test_djh VALUES('B', 7, 5);
1 row created.
SQL> INSERT INTO test_djh VALUES('C', 8, 1);
1 row created.
SQL> INSERT INTO test_djh VALUES('C', 9, 8);
1 row created.
SQL> INSERT INTO test_djh VALUES('C', 10, 8);
1 row created.
-- 查询语句测试
SQL> SELECT
2 dept_id
3 FROM
4 test_djh
5 WHERE
6 id = 1
7 UNION
8 SELECT
9 dept_id
10 FROM
11 test_djh
12 WHERE
13 boss_id = 1;
DEPT
----
A
B
C
SQL>
SQL> SELECT
2 dept_id
3 FROM
4 test_djh
5 WHERE
6 id = 2
7 UNION
8 SELECT
9 dept_id
10 FROM
11 test_djh
12 WHERE
13 boss_id = 2
14 ;
DEPT
----
A
SQL>
----------------------
总结:
就是把自己这个部门 UNION 自己是BOSS的部门
UNION 关键字,过滤掉重复的记录
注意,以上 SQL,仅仅适用于 2层 组织体系结构的。
有3层以上组织体系结构的, SQL语句需要适当修改。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
二楼正解。
稍微纠正一下:第一条记录boss_id 为NULL,这个要过滤掉。否则出现两次A.
增加distinct 去重复。
select distinct 部门ID from tablename where ID=@id or boss_id = @id
如果记录量大的话,不使用distinct,可以在where条件中增加
boss_ID is not null进行过滤
稍微纠正一下:第一条记录boss_id 为NULL,这个要过滤掉。否则出现两次A.
增加distinct 去重复。
select distinct 部门ID from tablename where ID=@id or boss_id = @id
如果记录量大的话,不使用distinct,可以在where条件中增加
boss_ID is not null进行过滤
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
oracle
select * from 表
start with id=':输入员工id'
connect by prior id=boos_id
select * from 表
start with id=':输入员工id'
connect by prior id=boos_id
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询