这里第三个问题 就是你要的
你参考一下这个
http://publish.it168.com/2005/1127/20051127009601.shtml?positioncode=1547某棵子树所有子节点信息
前面的两种查询返回的都是标量值,这里的查询需返回某棵子树的所有子节点的信息,这是一个结果集,需要用 table 数据类型来存储。函数定义如下:
CREATE FUNCTION dbo.GetSubtreeInfo
( @manager_id AS int
)
RETURNS @treeinfo table
( [员工号码] [char] (5) NOT NULL,
[姓名] [char] (10) NOT NULL,
[年龄] [int] NOT NULL,
[工资] [money] NOT NULL,
[上级号码] [char] (5) NULL,
[级别] [int] NOT NULL
)
其中,@manager_id 代表要查询的上司的员工号码,返回的是其所有下属的信息,这些信息存放在 table 型变量 @treeinfo 中。
由于该查询返回的是一个结果集,因此已经不能使用递归的方法来实现,我们使用循环的方法来实现,循环的过程为:将参数 @manager_id 所代表的上司的信息插入到表中,赋予级别0;级别增加为1,将所有上级号码为以上 @manager_id 的员工信息插入到表中;级别增加为2,将所有上级号码与第2步插入的记录中的员工号码一致的员工信息插入到表中;依次增加级别,直到找不到上级号码与前一步插入的纪录中的员工号码一致的员工信息为止。
为了实现这个循环,我们要用系统函数 @@ROWCOUNT 来判断前一步中是否有新的记录被插入到表中。如果有,则循环继续;如果无,则循环结束。另外,我们在表中增加了一个名为“级别”的字段,既可以显示出所在的级别关系,还可以用来代表每一次新插入的记录,可谓一举两得。完整的函数定义如下:
CREATE FUNCTION dbo.GetSubtreeInfo
( @manager_id AS char(5)
)
RETURNS @treeinfo table
( [员工号码] [char] (5) NOT NULL,
[姓名] [char] (10) NOT NULL,
[年龄] [int] NOT NULL,
[工资] [money] NOT NULL,
[上级号码] [char] (5) NULL,
[级别] [int] NOT NULL
) AS
BEGIN
DECLARE @level AS int
SELECT @level = 0
INSERT INTO @treeinfo
SELECT [员工号码], [姓名], [年龄], [工资], [上级号码], @level
FROM [员工信息]
WHERE [员工号码] = @manager_id
WHILE @@ROWCOUNT > 0
BEGIN
SET @level = @level + 1
INSERT INTO @treeinfo
SELECT E.[员工号码], E.[姓名], E.[年龄], E.[工资], E.[上级号码], @level
FROM [员工信息] AS E JOIN @treeinfo AS T
ON E.[上级号码] = T.[员工号码] AND T.[级别] = @level - 1
END
RETURN
END
下面是测试的结果:
SELECT * FROM dbo.GetSubtreeInfo(‘E9903’)
员工号码 姓名 年龄 工资 上级号码 级别
-------- --------- ------- --
E9903 郑可可 38 5000.0000 E9901 0
E9906 肖遥 26 3350.0000 E9903 1
E9907 黄菁菁 22 2800.0000 E9906 2
你参考一下这个
http://publish.it168.com/2005/1127/20051127009601.shtml?positioncode=1547某棵子树所有子节点信息
前面的两种查询返回的都是标量值,这里的查询需返回某棵子树的所有子节点的信息,这是一个结果集,需要用 table 数据类型来存储。函数定义如下:
CREATE FUNCTION dbo.GetSubtreeInfo
( @manager_id AS int
)
RETURNS @treeinfo table
( [员工号码] [char] (5) NOT NULL,
[姓名] [char] (10) NOT NULL,
[年龄] [int] NOT NULL,
[工资] [money] NOT NULL,
[上级号码] [char] (5) NULL,
[级别] [int] NOT NULL
)
其中,@manager_id 代表要查询的上司的员工号码,返回的是其所有下属的信息,这些信息存放在 table 型变量 @treeinfo 中。
由于该查询返回的是一个结果集,因此已经不能使用递归的方法来实现,我们使用循环的方法来实现,循环的过程为:将参数 @manager_id 所代表的上司的信息插入到表中,赋予级别0;级别增加为1,将所有上级号码为以上 @manager_id 的员工信息插入到表中;级别增加为2,将所有上级号码与第2步插入的记录中的员工号码一致的员工信息插入到表中;依次增加级别,直到找不到上级号码与前一步插入的纪录中的员工号码一致的员工信息为止。
为了实现这个循环,我们要用系统函数 @@ROWCOUNT 来判断前一步中是否有新的记录被插入到表中。如果有,则循环继续;如果无,则循环结束。另外,我们在表中增加了一个名为“级别”的字段,既可以显示出所在的级别关系,还可以用来代表每一次新插入的记录,可谓一举两得。完整的函数定义如下:
CREATE FUNCTION dbo.GetSubtreeInfo
( @manager_id AS char(5)
)
RETURNS @treeinfo table
( [员工号码] [char] (5) NOT NULL,
[姓名] [char] (10) NOT NULL,
[年龄] [int] NOT NULL,
[工资] [money] NOT NULL,
[上级号码] [char] (5) NULL,
[级别] [int] NOT NULL
) AS
BEGIN
DECLARE @level AS int
SELECT @level = 0
INSERT INTO @treeinfo
SELECT [员工号码], [姓名], [年龄], [工资], [上级号码], @level
FROM [员工信息]
WHERE [员工号码] = @manager_id
WHILE @@ROWCOUNT > 0
BEGIN
SET @level = @level + 1
INSERT INTO @treeinfo
SELECT E.[员工号码], E.[姓名], E.[年龄], E.[工资], E.[上级号码], @level
FROM [员工信息] AS E JOIN @treeinfo AS T
ON E.[上级号码] = T.[员工号码] AND T.[级别] = @level - 1
END
RETURN
END
下面是测试的结果:
SELECT * FROM dbo.GetSubtreeInfo(‘E9903’)
员工号码 姓名 年龄 工资 上级号码 级别
-------- --------- ------- --
E9903 郑可可 38 5000.0000 E9901 0
E9906 肖遥 26 3350.0000 E9903 1
E9907 黄菁菁 22 2800.0000 E9906 2
解决方案 »
- xtranbackup1.6的增量备份为什么 建的新表增量失效?
- mysql bat 游标
- 数据表设计讨论
- 求助,PostgreSQL怎么在windows下编译(或能解决我的编译问题)
- 什么版本的JDBC支持MySQL5.1.41,可以将Java连接MySQL的代码贴出来吗
- mysql 函数问题
- 怎样使用mysqlimport -u root --password=taiji tjlog< tjmysqldump
- jsp 为什么连接不上mysql 希望高手指点
- 请问mysql官方网页上的mysql gui是什么?和mysql cc 一样吗?
- 关于把连接oracle的bean改为连接mysql的问题。
- MySQL的几个初级问题
- pg 提问 , 我想把 每条数据里 的 每个字段内容 全角,或者半角里的空格去掉,我该则么做?(急)
-> name varchar(10) not null,type int not null);
Query OK, 0 rows affected (0.06 sec)mysql> insert into me values(1,'ly',3),(2,'wf',3),(3,'gg',4),(4,'pp',5);
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0mysql> select * from me;
+----+------+------+
| id | name | type |
+----+------+------+
| 1 | ly | 3 |
| 2 | wf | 3 |
| 3 | gg | 4 |
| 4 | pp | 5 |
+----+------+------+
4 rows in set (0.00 sec)mysql> select * from me where type<=4;
+----+------+------+
| id | name | type |
+----+------+------+
| 1 | ly | 3 |
| 2 | wf | 3 |
| 3 | gg | 4 |
+----+------+------+
3 rows in set (0.00 sec)因为经理的员工号越到后面就会越大,而且大的管理所有比他小的。
当然也可以这样做,一样的效果。不知道是不是你想要的结果。
mysql> select * from me where type < (select type from me where id=4);
+----+------+------+
| id | name | type |
+----+------+------+
| 1 | ly | 3 |
| 2 | wf | 3 |
| 3 | gg | 4 |
+----+------+------+
3 rows in set (0.00 sec)
我只是举个例子,其实经理的号不一定最大,是随意的。
to: zuguanqun(小群)
没看明白你的意思,能费心说明白一点吗?