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

主从表查询?

楼主tripman(牛愤︱9# dream)2005-06-08 18:02:19 在 MS-SQL Server / 基础类 提问

主表:t_master  
  id       name    
  1         A  
  2         B  
  3         C  
  4         D  
   
  从表:t_serv  
  id     s_id     flag   remark  
  1             1           1       ...    
  1             2           0       ...  
  2             1           1       ...  
  3             1           1  
  3             2           1  
  4             1           1  
  4             2           0  
  4             3           1  
   
  要求通过一条查询语句得到主表:t_master中其从表中的flag全为1的结果:  
  id       name    
  2         B  
  3         C  
   
   
  问题点数:50、回复次数:21Top

1 楼xluzhong(Ralph)回复于 2005-06-08 18:11:20 得分 20

select   a.*  
  from   t_master   a  
  inner   join   t_serv   b  
  on   a.id=b.id  
  where   not   exists(select   1   from   t_serv   where   id=b.id   and   flag<>1)Top

2 楼hsj20041004(光芒)回复于 2005-06-08 18:11:26 得分 0

select   id     ,name     from   t_master   where   id   in  
    (select   distinct   id   from   t_serv   where   flag=1)  
  Top

3 楼hsj20041004(光芒)回复于 2005-06-08 18:13:04 得分 0

select   id     ,name     from   t_master   where   id   in  
    (select   id   from   t_serv   where   flag=1   group   by   id   having   count(*)>1)Top

4 楼hsj20041004(光芒)回复于 2005-06-08 18:18:28 得分 0

---------  
  select   A.id     ,A.name     from   t_master   A   inner   join    
    (select   id,count(*)   num   from   t_serv   where   flag=1   group   by   id   )   B  
  on   A.id=B.id    
  inner   join   (select   id,count(*)   num   from   t_serv   group   by   id   )   C  
  on   B.id=C.id   and   B.num=C.num  
  Top

5 楼edgethinking(学习.net中...)回复于 2005-06-08 18:38:45 得分 20

1):   把t_serv表中   flag   <>   1的那些纪录找出来,   得到这些含有flag<>1的纪录的id.  
  2):   再从t_serv表中把第一步的那些id过滤出去,剩下的就都是=1的id了  
  3):从t_master表中找出含有第2步的id的纪录,就是结果了。  
   
   
  select   *   from   t_master   where   id   in   (     --(3)  
          select     distinct   id       from   t_serv   where   id   not   in   (       --(2)  
                  select   id   from   t_serv   where   flag   <>   1     --   (1)  
          )  
  )  
  Top

6 楼paoluo(一天到晚游泳的鱼)回复于 2005-06-08 18:53:46 得分 0

楼上的分析不错,但是似乎考虑复杂了一点,直接两步就可以了。  
   
  Select   *   from   t_master    
  Where   ID   Not   In   (Select   DIstinct   ID   from   t_serv   Where   flag=0)  
   
  这个比一楼的效率更高。Top

7 楼edgethinking(学习.net中...)回复于 2005-06-08 18:57:00 得分 0

楼上的:  
  那如果flag   不仅仅只有1,0这两个值, 怎幺办?  
  Top

8 楼zzjml168a(蓝天)回复于 2005-06-08 22:22:58 得分 0

/*如果flag   不仅仅只有1,0这两个值*/  
  可以考虑把flag转换成1,0来做!Top

9 楼paoluo(一天到晚游泳的鱼)回复于 2005-06-08 22:34:37 得分 0

回复人:   edgethinking(向JAVA骨灰级进军)   (   )   信誉:100     2005-06-08   18:57:00     得分:   0      
     
     
        楼上的:  
  那如果flag   不仅仅只有1,0这两个值, 怎幺办?  
   
  ------------------------------------  
  小改动一下即可  
   
  Select   *   from   t_master    
  Where   ID   Not   In   (Select   DIstinct   ID   from   t_serv   Where   flag<>1)  
     
  Top

10 楼xiaonvjing(飞扬)回复于 2005-06-09 05:38:56 得分 0

select   distinct   t_master.*   from   t_master   join   t_serv   on   t_master.id=t_serv.id   where   flag=1Top

11 楼miraclebest(小妹妹)回复于 2005-06-09 09:56:51 得分 0

我想问一下,如果要在一个sql   server   数据库里创建两个主键,该怎样做呢?Top

12 楼tripman(牛愤︱9# dream)回复于 2005-06-09 11:15:50 得分 0

edgethinking(向JAVA骨灰级进军)   的方法条理比较清晰可以达到目的  
   
  paoluo(一天到晚游泳的鱼)   的方法如果在主表里有而从表里没有的ID也会被选出来Top

13 楼txqgyf(执著与爱)回复于 2005-06-11 12:08:41 得分 0

select   *   from   t_master   join   t_serv   on   t_master.id=t_serv.id   where   t_serv.flag=1Top

14 楼paoluo(一天到晚游泳的鱼)回复于 2005-06-11 15:07:37 得分 10

回复人:   tripman(当牛粪遇上鲜花)   (   )   信誉:100     2005-06-09   11:15:00     得分:   0      
     
     
        edgethinking(向JAVA骨灰级进军)   的方法条理比较清晰可以达到目的  
   
  paoluo(一天到晚游泳的鱼)   的方法如果在主表里有而从表里没有的ID也会被选出来  
       
     
  ----------------------------------------  
  哦,这一点的确没有考虑到。  
   
  看你的例子,我以为主表有的ID细表中一定有的。  
   
  那用edgethinking的吧。Top

15 楼filebat(Mark)回复于 2005-06-11 17:25:19 得分 0

--怎么这个问题有这么多要说的吗?先把我的答案贴出来.等阵子看看大家都在聊些什么.  
   
   
  select   *    
  from   t_master  
  where   not   exists(  
  select*  
  from   t_serv  
  where   t_master.id=id  
                  and   flag=0)  
  Top

16 楼paoluo(一天到晚游泳的鱼)回复于 2005-06-13 09:22:29 得分 0

呵,filebat(Mark)   ,你的语句的结果也和我的一样。  
   
  会出现楼主说的这种情况,“主表里有而从表里没有的ID也会被选出来”。Top

17 楼filebat(Mark)回复于 2005-06-15 19:13:45 得分 0

--呵呵paoluo,   那咱们再加一个补丁,试试  
  select   *    
  from   t_master  
  where   not   exists(  
  select*  
  from   t_serv  
  where   t_master.id=id  
                  and   flag<>1)  
  and   exists(   select*    
  from   t_serv  
  where   t_master.id=id)Top

18 楼qzxyd(只会种菜)回复于 2005-06-15 19:59:41 得分 0

如下语比较简单而全面:  
  select   *  
  from   t_master  
  where   id   not   in   (select   distinct   id   form   t_serv   where   flag<>1)    
  and   id   in   (select   distinct   id   from   t_serv)   //去掉有主表无从表的记录。  
  Top

19 楼vivianfdlpw()回复于 2005-06-15 22:25:16 得分 0

create   table   t_master  
  (  
      id   int,   name   varchar(20)  
  )  
   
  create   table   t_serv  
  (  
      id   int,sid   int,flag   int,remark   varchar(100)  
  )  
   
  go  
   
  insert   t_master  
  select   1,'A'   union   select   2,'B'   union   select   3,'C'   union   select   4,'D'  
   
  insert   t_serv  
  select   1,1,1,''   union  
  select   1,2,0,''   union  
  select   2,1,1,''   union  
  select   3,1,1,''   union  
  select   3,2,1,''   union  
  select   4,1,1,''   union  
  select   4,2,0,''   union  
  select   4,3,1,''  
   
  select   distinct   A.id,(select   name   from   t_master   where   id=A.id)   as   name    
  from   t_serv   A    
  where   A.id   not   in   (select   distinct   id   from   t_serv   where   flag=0)  
   
   
  --删除测试数据  
  drop   table   t_master  
  drop   table   t_serv  
   
   
  --   结果  
  2 B  
  3 C  
  Top

20 楼pingdan_yang(疯子痒)回复于 2005-06-15 23:30:28 得分 0

大家为什么对这样简单的问题不停的回付呀,前面的就对了,真实受不了了。Top

21 楼tripman(牛愤︱9# dream)回复于 2005-06-16 18:24:49 得分 0

谢谢大家关注!  
   
  vivianfdlpw()   的还是有问题  
   
  以上都有几位给出了正确语句,关键是把主表里有而从表里没有的ID排除就OK  
   
  我也总结了一条:  
   
  select   distinct   a.*    
  from   t_master   a,t_serv   b  
  where   not   exists(select   1   from   t_serv   where   id=a.id   and     flag<>1)   and   a.id=b.id  
  Top

相关问题

  • 主从表查询问题,急
  • 主从表查询(在线等候)
  • 主从表查询的SQL语句
  • 主从表中大数据量的查询
  • 关于主从表查询的问题(sqlserver2000)
  • 主从表的一个查询SQL(需要帮助)
  • 帮忙写个主从表查询的SQL语句
  • 关于查询主从表显示的问题?
  • 主从表联合查询 数据段相同的问题 难么?
  • 高手进来!!!一个关于主从表联合查询的问题!!!

关键词

  • 语句
  • serv
  • 主表
  • unionselect
  • master
  • flag
  • edgethinking
  • distinct
  • masterwhere
  • paoluo

得分解答快速导航

  • 帖主:tripman
  • xluzhong
  • edgethinking
  • paoluo

相关链接

  • SQL Server类图书

广告也精彩

反馈

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