CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

这句sql应该怎么写?

楼主fangss()2002-12-03 15:13:21 在 MS-SQL Server / 基础类 提问

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

相关问题

  • 这句sql应该怎么写?
  • 这个SQL语句应该怎么写?
  • 这句sql句子应该怎么写?
  • 这条sql语句应该怎么写?
  • 求助:着句SQL应该怎么写?
  • 这个SQL语言应该怎么写
  • 这个SQL语句应该怎么写?
  • 这个sql语句应该怎么写??
  • 这条sql语句应该怎么写?
  • 这样的sql应该怎么写?

关键词

  • 查询
  • skill
  • person
  • idfrom
  • distinct
  • insert
  • 条件
  • table
  • count
  • where

得分解答快速导航

  • 帖主:fangss
  • zzhuz
  • IronPromises
  • Chiff
  • sky_blue

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo