这句sql应该怎么写?
table person:
person_id,
name,
age
...
table person_skill:
skill_id,
person_id
person与person_skill是一对多的关系,即没个人会有多种skill.
现在我根据多个skill_id,把符合条件的人查出来.
注意:结果必须是完全符合多个skill才行.
例:
person
person_id
1
2
3
person_skill:
person_id skill_id
1 1
1 2
1 3
2 1
3 2
如果查询skill_id为1的person,结果为:1,2
如果查询skill_id为1,2,3的person,结果为:1
如果查询skill_id为1,4的person,结果没有.
有什么好办法吗?
问题点数:100、回复次数:19Top
1 楼IronPromises(铁诺)回复于 2002-12-03 15:16:12 得分 0
一句无法写。Top
2 楼fangss()回复于 2002-12-03 15:22:36 得分 0
没有好方法吗?Top
3 楼senzz(森)回复于 2002-12-03 15:23:49 得分 0
select distinct person_id
from table
where skill_id in (查询条件)
这里的查询条件就是你上面所说的Top
4 楼fangss()回复于 2002-12-03 15:27:00 得分 0
不行吧?
能否说明白点?Top
5 楼zzhuz(大件)回复于 2002-12-03 15:29:32 得分 5
select person_id from person
where person_id in(
select person_id from person_skill
where skill_id=1 and skill_id=2....and skill_id=n)Top
6 楼IronPromises(铁诺)回复于 2002-12-03 15:32:44 得分 5
declare @v varchar(1000)
set @v=''
select @v=@v+','+person_id from person_skill
where skill_id = 你的条件 order by person_id;
set @v=right(@v,len(@v)-1)
print @vTop
7 楼CrazyFor(冬眠的鼹鼠)回复于 2002-12-03 15:38:29 得分 0
select person_id from person
where person_id in('1','2')
Top
8 楼senzz(森)回复于 2002-12-03 15:40:12 得分 0
select person_id
from person_skill
where skill_id in (查询条件)
Top
9 楼Chiff(~o~)回复于 2002-12-03 15:50:14 得分 10
--可以做到。
create table person_skill(skill_id int,person_id int)
insert into person_skill values(1,1)
insert into person_skill values(1,2)
insert into person_skill values(1,3)
insert into person_skill values(2,1)
insert into person_skill values(3,2)
insert into person_skill values(3,5)
--如果查询skill_id为1的person
declare @table table(id int)
insert into @table values(1)
select skill_id
from person_skill
where person_id in (select id from @table)
group by skill_id
having count(distinct person_id) = (select count(distinct id) from @table)
--结果为1,2
--如果查询skill_id为1,2,3的person
declare @table table(id int)
insert into @table values(1)
insert into @table values(2)
insert into @table values(3)
select skill_id
from person_skill
where person_id in (select id from @table)
group by skill_id
having count(distinct person_id) = (select count(distinct id) from @table)
--结果为:1
--等等...Top
10 楼Chiff(~o~)回复于 2002-12-03 15:53:12 得分 0
用一句来表示:
select skill_id
from person_skill
where person_id in (select id from 条件表 where 条件)
group by skill_id
having count(distinct person_id) =
(select count(distinct id) from 条件表 where 条件)Top
11 楼sky_blue(蓝天2007)回复于 2002-12-03 15:54:52 得分 0
一个函数一个存储过程可以完成此任务。Top
12 楼sky_blue(蓝天2007)回复于 2002-12-03 15:56:06 得分 0
用存储过程来做吧。Top
13 楼yonghengdizhen(等季节一过,繁花就凋落)回复于 2002-12-03 15:59:32 得分 0
用集合查询以及连接查询\相关子查询都可以做到.
关键是你的那个skill_id条件值数是否确定..
若不确定,纯sql语句是无法解决的.Top
14 楼sky_blue(蓝天2007)回复于 2002-12-03 16:15:49 得分 80
create table person_skill ( person_id int,skill_id int)
go
insert person_skill values (1,1)
insert person_skill values (1,2)
insert person_skill values (1,3)
insert person_skill values (2,1)
insert person_skill values (3,2)
go
create function get_list (@person_id int)
returns varchar(800)
as
begin
declare @str varchar(800)
select @str =''
select @str =@str + ','+convert(varchar(8),skill_id) from person_skill where person_id = @person_id
return @str
end
go
select person_id from (
select person_id,dbo.get_list(person_id) list from person_skill group by person_id) t1
where list like '%,1%' and list like '%,3%'
Top
15 楼sky_blue(蓝天2007)回复于 2002-12-03 16:18:00 得分 0
where list like '%,1%' and list like '%,3%'
查1,3
where list like '%,1%' and list like '%,3%' and list like '%,4%'
查1,3,4
Top
16 楼petkoala(考拉)回复于 2002-12-03 16:18:28 得分 0
楼上的很详细了!Top
17 楼fangss()回复于 2002-12-03 16:54:21 得分 0
to sky_blue(老衲) :
我试过了,非常正确!多谢了.
但还比太明白,能否讲讲get_list 到底是什么?
不要见笑,没写过存储过程.Top
18 楼yonghengdizhen(等季节一过,繁花就凋落)回复于 2002-12-03 18:24:03 得分 0
get_list是function,sql server 2000支持自定义函数..
问题是给你解决了,但他这而存在有硬编码的问题,不利于扩展,当然,如果你的应用需求不可能有太多变化的话这么做是可以的,否则改动就大了.Top
19 楼yonghengdizhen(等季节一过,繁花就凋落)回复于 2002-12-03 18:27:49 得分 0
其实他这么做还不如直接用sql实现,至少当需求变化时,修改时只是修改sql语句部分.
况且他这个函数并不具有太多的通用性.Top




