悬赏分:10 浏览:311 次
数据库里有一个表,主要有两个字段 [姓名],[技能]
可能的数据如下
[姓名] [技能]
甲 技能1
甲 技能2
甲 技能3
乙 技能1
乙 技能2
乙 技能4
丙 技能2
丙 技能3
丁 技能1
丁 技能4
......
现在我想找到拥有技能1,同时还拥有技能2的人。
希望能够通过一个sql语句得到这样的结果
[姓名] [技能]
甲 技能1
甲 技能2
乙 技能1
乙 技能2
丙拥有技能2,但是没有技能1,不能显示出来。
丁只有技能1没有技能2也不能显示。
想了大约两个小时没有想出来,希望大家能够帮帮忙。谢谢。
|
是不是这个效果:
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'
select t1.姓名 from 技能表 t1 join 技能表 t2 on t1.姓名 = t2.姓名 (...) where t1.技能 ='技能1' and t2.技能 = '技能2' (...) 可以在(...)处加上新的join和条件来找有三个或四个技能的人. 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.姓名-->查询同时拥有两个技能的人的姓名 假设您的表名叫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 您这里大概是某技能表吧 。 楼上的说得正是 玉开的牛! 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 --得到结果 只需要用,号将要包含的字段内容隔开就可以了。拓展性极高 哪那么多技能~~长见识了 |
|
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) 这也行~ |