| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1305 人关注过本帖
标题:这个SQL该怎么写?
只看楼主 加入收藏
leonardo38
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2009-1-1
结帖率:20%
收藏
 问题点数:0 回复次数:9 
这个SQL该怎么写?
数据库表结构如下:
ID    NAME    ACE    MANAOER
100    A    30    104
103    B    19    104
104    C    20    111
107    D    35    109
112    E    23    120
113    F    43    NULL
要求:列出所有年龄比下属年龄小的主管的ID和NAME,并请这两个字段名称以“编号”、“姓名”显示。

我尝试了几次,我自己写出来的相当麻烦,因为要用到很多子查询,不知道哪位高手能指教下简单的方法
搜索更多相关主题的帖子: SQL 
2010-01-21 10:56
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
哪个字段可以看出上下级关系
2010-01-21 13:55
leonardo38
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2009-1-1
收藏
得分:0 
MANAOER就是上级主管的ID,引用的是这张表的ID字段
2010-01-21 14:05
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
这样行不?
select ID 编号,NAME 姓名 from 表名 a where age<(select max(age) from 表名 b where b.id=a.id group by b.MANAOER )

★★★★★为人民服务★★★★★
2010-01-21 15:57
leonardo38
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2009-1-1
收藏
得分:0 
似乎不行,我看你的SQL貌似写的是多表的,问题是这个没有关联的,就是同一个表的MANAOER字段引用自身的ID字段,所以这个问题搞的好像很复杂了,我自己写的比较麻烦,插入了多个子查询
2010-01-21 16:25
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
你仔细看看,这是针对一张表,“表名”位置是同一张表啊!你的要求我是理解的,不能说是很复杂。

★★★★★为人民服务★★★★★
2010-01-22 07:51
miqi
Rank: 2
等 级:论坛游民
帖 子:17
专家分:14
注 册:2009-12-30
收藏
得分:0 
SELECT 新表名1.ID AS 编号,新表名1.NAME AS 姓名
FROM 原表名 新表名1 JION 表原表名 新表名2 ON  新表名1.MANAORE=新表名2.ID
WHERE 新表名1.AGE<新表名2.AGE

解释一下:
首先判断一下,这个题目是要求的比较同一个表中的年龄,并且比较的一同一个表中的年龄列,那样我们只好来对这个表起个别名了,新表名1,新表名2。
我们要做的一把同一个主管的管的下属连接,然后把多个主管的组合到一起,就像是在C语言中的双重FOR循环,

INT I;
INT J;
FOR(I=0;I<5;I++)
    {   
        FOR(J=0;J<5;J++)
            PRINTF("@");
            PRINTF("\N);   
    }

这个是说明在I为0时,J循环,在这里主管就相当于I,下属相当于J。
然后比较一下主管的年龄个下属的年龄就好了,

最后,查询的列要重命名时要注意了,不能直接写的,因为在起别名的表中,要明确指出是说的哪一个新表的表名点列名。
否则系统不知道是调用的哪个表,就会出错的!
这里采用的是ANSI 连接,因为这种的效率要比传统的好。速度达到了优化,且向后兼容.
嘿嘿
2010-01-22 09:49
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
--给你一个完整的吧:
--创建一个表
create table xxxx (id int,name char(10),age int,MANAOER int)
go
--添加数据
insert into xxxx values(100 ,   'A',    30,    104)
insert into xxxx values(103 ,   'B',    19,    104)
insert into xxxx values(104 ,   'C',    20,    111)
insert into xxxx values(107 ,   'D',    35,    109)
insert into xxxx values(112 ,   'E',    23,    120)
insert into xxxx values(113 ,   'F',    43,    NULL)
go
--执行查询
select ID 编号,NAME 姓名 from xxxx a where age<(select max(age) from xxxx b where b.MANAOER=a.id group by b.MANAOER)
--结果为:
--------------
--编号 + 姓名-
--104  + C   -
--------------
--如果你要的主管是比所有下属都小的话将查询语句中max改为Min就行了 (注:前面回答中where 后面有误,今天是在SQL Server2005中测试过的)
--友情提示:实践出真知,一定要多试啊!

[ 本帖最后由 cnfarer 于 2010-1-22 14:05 编辑 ]

★★★★★为人民服务★★★★★
2010-01-22 14:02
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
以下是引用cnfarer在2010-1-22 14:02:34的发言:

--给你一个完整的吧:
--创建一个表
create table xxxx (id int,name char(10),age int,MANAOER int)
go
--添加数据
insert into xxxx values(100 ,   'A',    30,    104)
insert into xxxx values(103 ,   'B',    ...
你这样只考虑了一层
如果他的下级又含有下级呢
2010-01-22 15:21
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
你的意思是这样的吗?
假如有一个主管,他的直接下属都比他小,但他的间接下属比他大,那么这个主管也是符合条件的是嘛?!

如果是这样,那么这个语句肯定不可能这么简单!

[ 本帖最后由 cnfarer 于 2010-1-23 15:14 编辑 ]

★★★★★为人民服务★★★★★
2010-01-23 15:07
快速回复:这个SQL该怎么写?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028829 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved