新足迹

 找回密码
 注册

精华好帖回顾

· 外汇保证金新手投资完全手册(2010年修改版) (2010-1-10) 猎梦人 · 纪念我的发小-贝贝 (2019-12-22) 小信
· 参加活动: 喂饱7口人,折腾10道菜,花费100块大毛,川粤于2014--2015年间 (2015-1-5) ayeeda · XXXX之往事系列 (2006-12-18) riverstone
Advertisement
Advertisement
查看: 1495|回复: 13

一个Sql有趣的小问题,上班闲的可以进来看看:) [复制链接]

发表于 2011-3-3 09:55 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个世界上除了把正妹之外,最有趣的事情还包括写一些sql query :-)


现在有这么一个table,里面的原始数据如图1,关系也很简单:




1,Ken是top level的manager;

2,Brian reports给Ken;

3,David,Stephen,Syed report给Brian;

4,以此类推....


现在需要一个query把所有employee按照他们的级别层次地列出,效果如图2.



有兴趣的可以想想有什么简单一些的办法:)  (大牛们请轻拍




P.S.附上创建table和data的query:

CREATE TABLE dbo.MyEmployees
(
        EmployeeID smallint NOT NULL,
        FirstName nvarchar(30)  NOT NULL,
        LastName  nvarchar(40) NOT NULL,
        Title nvarchar(50) NOT NULL,
        DeptID smallint NOT NULL,
        ManagerID int NULL,
CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC)
);



INSERT INTO dbo.MyEmployees VALUES
(1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
,(16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)
,(23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);

[ 本帖最后由 BJ-KING 于 2011-3-3 10:57 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1积分 +6 收起 理由
bulaohu + 6 感谢分享

查看全部评分

Advertisement
Advertisement

发表于 2011-3-3 10:10 |显示全部楼层
此文章由 mylt 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mylt 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SELECT DISTINCT employeeid, managerid, title
FROM MyEmployees

发表于 2011-3-3 10:13 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 mylt 于 2011-3-3 11:10 发表
SELECT DISTINCT employeeid, managerid, title
FROM MyEmployees



这个是你的运行结果:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

发表于 2011-3-3 10:16 |显示全部楼层
此文章由 mylt 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mylt 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是说顺序还要和你的一样吗?

发表于 2011-3-3 10:17 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
it's typical scenario for cte recursion

http://smehrozalam.wordpress.com ... hical-relationship/

评分

参与人数 2积分 +6 收起 理由
mylt + 3 学习
BJ-KING + 3 你太有才了

查看全部评分

发表于 2011-3-3 10:20 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-3-3 11:17 发表
it's typical scenario for cte recursion

http://smehrozalam.wordpress.com ... hical-relationship/




乱码兄,写Sql要比把妹麻烦不少吧?
Advertisement
Advertisement

发表于 2011-3-3 10:20 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SQL 2005, 2008, 2008R2 都支持CTE了

发表于 2011-3-3 10:22 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 BJ-KING 于 2011-3-3 11:20 发表




乱码兄,写Sql要比把妹麻烦不少吧?


No,好玩多了,起码不会被人拒绝 

发表于 2011-3-3 10:25 |显示全部楼层
此文章由 mylt 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mylt 所有!转贴必须注明作者、出处和本声明,并保持内容完整
哈哈,
原来我没理解对题目,是要有层次顺序的。
学习了

发表于 2011-3-3 10:34 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 mylt 于 2011-3-3 11:25 发表
哈哈,
原来我没理解对题目,是要有层次顺序的。
学习了




你看一下乱码帅哥给你链接,再试试写写看。


我以前也不太写这方面的query的,后来偶然遇到个类似的问题,觉得用sql实现比c#里面用递归更方便。

评分

参与人数 2积分 +6 收起 理由
mylt + 3 学习
乱码 + 3 你太有才了

查看全部评分

发表于 2011-3-3 11:01 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
I saw such topics in couple of SQL books, exactly the same scenario.
Advertisement
Advertisement

发表于 2011-3-3 11:23 |显示全部楼层
此文章由 mylt 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mylt 所有!转贴必须注明作者、出处和本声明,并保持内容完整
学习了一下cte。

DECLARE @i INT
SELECT @i=1;
WITH my_cte(employeeid, managerid, title, Level)
AS
(
        SELECT employeeid, managerid, title, 1 AS [Level]
                FROM myemployees
                WHERE employeeid=@i
        UNION ALL
        SELECT c.employeeid, c.managerid, c.title ,[Level] + 1
                FROM myemployees c
                INNER JOIN my_cte ct
                ON c.managerid=ct.employeeid
)
SELECT employeeid, managerid, title FROM my_cte;
GO

评分

参与人数 1积分 +3 收起 理由
BJ-KING + 3 我很赞同

查看全部评分

改写人生

发表于 2011-3-3 11:27 |显示全部楼层

回复 12# 的帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
太好了,一起学习了:)

参与宝库编辑功臣

发表于 2011-3-4 12:41 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我一看lz的问题就知道乱码和cte,recursion两个关键词肯定同时冒出来

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 haha,你是专家~~

查看全部评分

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部