请问各位大侠,这个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句子怎么写呢?
能解决的话追加悬赏
展开
 我来答
百度网友66a8d48e5
2010-08-26 · TA获得超过7687个赞
知道大有可为答主
回答量:3002
采纳率:12%
帮助的人:3905万
展开全部
这个是典型的自连接表,具体到这个问题上,就是一个员工表,很显然三级结构一块放在这里了,也就是说,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时的无谓结果.你永远可能都不会用到,也是永远不用知道老板属于哪个部门或是所在部门!虽然他跟现实中十分接近,老板在某个部门要职,但对于数据库设计来说他却是多余的信息而毫无用处!一楼的还处于课本知识?语句写的不要太长了,有时除了会影响性能外,也是没有多大用处的!
雪夜hpping
2010-08-26 · TA获得超过468个赞
知道小有建树答主
回答量:308
采纳率:0%
帮助的人:467万
展开全部
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中有其它数据,其它部门无数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangzhiqing999
2010-08-26 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3362万
展开全部
建立测试表

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语句需要适当修改。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
钊悌EK
2010-08-26 · TA获得超过151个赞
知道答主
回答量:74
采纳率:0%
帮助的人:88.4万
展开全部
二楼正解。
稍微纠正一下:第一条记录boss_id 为NULL,这个要过滤掉。否则出现两次A.
增加distinct 去重复。
select distinct 部门ID from tablename where ID=@id or boss_id = @id

如果记录量大的话,不使用distinct,可以在where条件中增加
boss_ID is not null进行过滤
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
石亮东
2010-08-26 · TA获得超过1217个赞
知道小有建树答主
回答量:2022
采纳率:66%
帮助的人:1413万
展开全部
oracle

select * from 表
start with id=':输入员工id'
connect by prior id=boos_id
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式