[已解决问题] 需求一个SQL语句。达到and的效果。谢谢
提问时间: 2008-07-14 19:18
悬赏分:10 浏览:311 次

数据库里有一个表,主要有两个字段 [姓名],[技能]

可能的数据如下

[姓名]  [技能]
甲      技能1
甲      技能2
甲      技能3
乙      技能1
乙      技能2
乙      技能4
丙      技能2
丙      技能3
丁      技能1
丁      技能4

......

现在我想找到拥有技能1,同时还拥有技能2的人。

希望能够通过一个sql语句得到这样的结果

[姓名]  [技能]
甲  技能1
甲  技能2
乙  技能1
乙  技能2

丙拥有技能2,但是没有技能1,不能显示出来。
丁只有技能1没有技能2也不能显示。

想了大约两个小时没有想出来,希望大家能够帮帮忙。谢谢。


问题补充:不仅是两个技能,也可能是三个或者多个技能一起查。

另外还会有其他的查询条件,当然其他的就只有一个关键字了。

最佳答案
with t_cn as ( select 姓名,技能,cn = COUNT(*) OVER(PARTITION BY 姓名) from tableName WHERE 技能 = '技能1' OR 技能 = '技能2' )select 姓名,技能 from t_cn where cn = 2
2008/7/15 8:45:42 回答者:玉开
其它回答(8)
是不是这个效果: select * from [Name] where 姓名 in (select 姓名 from [Name] where 姓名 in (select 姓名 from [Name] where 技能='技能1') and 技能='技能2') and 技能='技能1' union select * from [Name] where 姓名 in (select 姓名 from [Name] where 姓名 in (select 姓名 from [Name] where 技能='技能1') and 技能='技能2') and 技能='技能2'
3个月前   回答者:侯垒 - 小虾三级
select t1.姓名 from 技能表 t1 join 技能表 t2 on t1.姓名 = t2.姓名 (...) where t1.技能 ='技能1' and t2.技能 = '技能2' (...) 可以在(...)处加上新的join和条件来找有三个或四个技能的人.
3个月前   回答者:deerchao - 大侠五级
select 姓名,技能 from table1 where 姓名 in (select a.姓名 from table1 a , table1 b where a.技能='技能1' and b.技能='技能2' and a.姓名=b.姓名) select a.姓名 from table1 a , table1 b where a.技能='技能1' and b.技能='技能2' and a.姓名=b.姓名-->查询同时拥有两个技能的人的姓名
3个月前   回答者:南风 - 菜鸟二级
假设您的表名叫Table1,则语句如下: select 姓名,技能 from Table1 where 姓名 in( SELECT 姓名 FROM Table1 WHERE 技能 in ( '技能1','技能2') GROUP BY 姓名 HAVING (COUNT(姓名) = 2) ) and 技能 in ( '技能1','技能2') ----------------- 如果你的技能不确定是几个,那就将 '技能1','技能2' 换成一个select 语句,取出你想要的技能;COUNT(姓名) = 2 这里的2表示有几个技能,也可以换成select count(XX) from 您这里大概是某技能表吧 。
3个月前   回答者:datasky - 小虾三级
楼上的说得正是
2个月前   回答者:放飞心情 - 初学一级
玉开的牛!
2个月前   回答者:IamV - 初学一级
DECLARE @temp VARCHAR(20) --申明变量, 也就是输入参数 SET @temp='a,b' --为变量赋值 WITH aa(a,b,c,d) AS --处理数据库中数据 ( SELECT benji,ASCII(shangji),1,shangji FROM [dengji] UNION ALL SELECT benji,b+ASCII(SUBSTRING(shangji,c+1,1)),c+1,shangji FROM aa ,dengji WHERE dengji.[benji]=aa.a AND dengji.[shangji]=aa.d AND c<len(shangji) ), bb AS ( SELECT a,d,MAX(b)AS b FROM aa GROUP BY a,d ), cc AS --得到处理结果 ( SELECT a,d,SUM(b) OVER (PARTITION BY a) AS b FROM bb ), dd(b,a) AS --处理传入参数 ( SELECT ASCII(@temp),1 UNION ALL SELECT b+ASCII(SUBSTRING(REPLACE(@temp,',',''),a+1,1)),a+1 FROM dd WHERE a<len(REPLACE(@temp,',','')) ), ff AS --匹配数据 ( SELECT a,b,d FROM cc WHERE cc.b=(SELECT MAX(dd.b) FROM dd) ), ee AS --验证数据正确行,二次过滤 ( SELECT *,COUNT(a) OVER (PARTITION BY a) AS c FROM ff WHERE @temp LIKE '%'+d+'%' ) SELECT a,d FROM ee --得到结果 只需要用,号将要包含的字段内容隔开就可以了。拓展性极高
2个月前   回答者:KindSoul - 菜鸟二级
哪那么多技能~~长见识了
2个月前   回答者:陈修国 - 菜鸟二级
评论
3个月前   侯垒 :
@deerchao
好像楼主的意思是一个表有两个字段.而并不是技能表1与技能表2.
2个月前   deerchao :
@侯垒:
我的sql只是把同一个表自联接而已,并不需要有两个表..
2个月前   侯垒 :
@deerchao
哦,不好意思,我以为你说的是两个表呢!
2个月前   金色海洋(jyk) :
在这里回复是什么样子呢?
2个月前   I'm ABC :
好像还没出来啊
2个月前   I'm ABC :
select * from tablename
where 姓名 in
(select a.姓名 from tablename a
inner join tablename b
on a.技能='技能一' and b.技能='技能二' and a.姓名=b.姓名)
and 技能 in ('技能一','技能二')

这样的可以
2个月前   I'm ABC :
select * from tablename where 技能 in ('技能一','技能二')
and 姓名 in
(select 姓名 from tablename where 技能 in ('技能一','技能二')
group by 姓名
having count(姓名)=2)

这也行~
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接