sql 查询日记1

今天在问题提问区看到一个问题

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

可能的数据如下

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

......

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

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

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

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

看了其他人回答,使我冒出一个用递归来查新的想法
代码如下:

 1DECLARE @temp VARCHAR(20)    --申明变量,  也就是输入参数
 2SET @temp='a,b,c,d,e,f,g,h,aa'        --为变量赋值
 3WITH aa(a,b,c,d) AS    --处理数据库中数据
 4(
 5    SELECT benji,ASCII(shangji),1,shangji FROM [dengji]
 6    UNION ALL
 7    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)
 8),
 9bb AS
10(
11    SELECT a,d,MAX(b)AS b FROM aa GROUP BY a,d
12),
13cc AS        --得到处理结果
14(
15    SELECT a,d,SUM(b) OVER (PARTITION BY a) AS b FROM bb
16),
17dd(b,a) AS        --处理传入参数
18(
19    SELECT ASCII(@temp),1
20    UNION ALL
21    SELECT b+ASCII(SUBSTRING(REPLACE(@temp,',',''),a+1,1)),a+1 FROM dd WHERE a<len(REPLACE(@temp,',',''))
22),
23ff AS        --匹配数据
24(
25    SELECT a,b,d FROM cc WHERE cc.b=(SELECT MAX(dd.b) FROM dd)
26),
27ee AS            --验证数据正确行,二次过滤
28(
29    SELECT *,COUNT(a) OVER (PARTITION BY a) AS c FROM ff WHERE @temp LIKE '%'+d+'%'
30)
31SELECT a,d FROM ee --得到结果

简单试了一下暂时没有发现什么问题
就是有点复杂,传入参数是以‘,’号隔开的技能
posted @ 2008-07-19 11:20  KindSoul  阅读(1363)  评论(15编辑  收藏  举报