当前位置: 网学 > 编程文档 > SQL SERVER > 正文

难道SQL的子查询就是鸡肋吗?

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/19
下载{$ArticleTitle}原创论文样式

  MSDN对子查询的定义是这样的:

     可以将一个查询的结果用作另一个查询的输入。可以将子查询的结果用作使用 IN( ) 函数、EXISTS 运算符或 FROM 子句的语句。

     一条好的值得称赞的规则是尽量用连接代替所有的子查询。优化器有时可以自动将子查询“扁平化”,并且用常规或外连接代替。但那样也不总是有效。明确的连接对选择表的顺序和找到最可能的计划给出了更多的选项。当你优化一个特殊查询时,了解一下是否去掉自查询可产生很大的差异。这段话出自http://www.innovatedigital.com/htm_speek/SQLServerOpt.shtml它显然告诉我们在查询的时候最好不要用子查询,当时我并不太在意,至到我有一次遇到了这样的情况。  
      
     现在的网站主要的压力都来自于数据库,频繁的数据库访问经常会使服务器死机。我的原则就是尽量减少数据库的连接,能一次性取出的决不多连接数据库一次,但是有时候并不完全是这样。郁闷,无解。    
 
     下面一条SQL语句里面有一个子查询,info.RESOURCE_VOLUMECOUNT,它是指一个电影共有多少集.这个字段是int类型的.子查询的目的就是计算出一个电影在资源表中总共有多少集(实际存在的), 两者做减法操作就可以计算出这个电影共缺多少集(lastCount)我们知道在这条语句执行的时候,外层记录查询一次在计算 lastCount字段的时候又要查询表:电影表一次.如果最外层有10条记录,那么执行这次查询一共要扫描电影表11次,连接数据库1次.
     

    基于有的朋友看不明白我写的SQL语句,可能是因为我写的有些字段和本案例没有太大关系的原因,现在特将它们做一个替换.


string SqlCode = @"select distinct info.resource_officialname ,
          info.resource_id,
          字段1,         
           (
              info.RESOURCE_VOLUMECOUNT -
               (select count(vid3.resource_id ) from 电影表 info3
                 inner join TB_RESOURCE_PRIMARVIDEO vid3 on
                  info3.resource_id =vid3.resource_id and
                  info.resource_id =vid3.resource_id 
                  
               )
           ) as lastCount,
          字段2
        &n
  • 下一篇资讯: 主键的故事
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号