select a.* from fsprd.fs_goods_docs a
where gdd_id=(Select cnm_gdd_id from fsprd.fs_need_containers
where cnm_id=19546)
select a.* from  fsprd.fs_goods_docs a, fsprd.fs_need_containers b
where a.gdd_id=b.cnm_gdd_id and 
b.cnm_id=19546 请问这两个SQL语句那个的效率更高,更推荐使用?
请说明原因

解决方案 »

  1.   

    我想应该是前一种!!
    后一种要进行表连接操作(ACCESS中是迪卡尔基,效率不用我说了吧。SQLSERVER好一些进行自然连接)所以都不如子查询有效率(尤其数据量大时)。
    TO ljmanage(过客):你是什么谬论?!  :)
      

  2.   

    我刚才用SQL Server Profiler和SQL Server Query Analyzer测试了一下
    用第一种办法
    select 'start'
    go
    select t2.* from t2 where t2.id in (select id from t1 )
    go
    select 'end'
    go
    在SQL Server Profiler中观察:中间一句花费时间10毫秒。
    换用第二种方法
    select 'start'
    go
    SELECT t1.* FROM t1,t2 where t1.id=t2.id
    go
    select 'end'
    go
    观察:中间一句花费时间20毫秒。
    也就是说,前一种方法,也就是使用子查询的方法效率远高于后者
      

  3.   

    不知道各位有没有看过数据库导论
    上面说了 笛卡尔乘积的问题:
    如果楼主的两个表:一个有m条记录 另一个有n条记录
    则用后一种方法会先生成m X n条记录 然后在根据条件去查找符合条件的记录,并输出
    而用前一种方法 则先生成m,进行第一次筛选,再生成n,再筛选
    所以前一种方法查询的记录树为m+n那种有效一目了然
      

  4.   

    cpu(赛洋400)128DDRselect 订单.* 
    from 订单,订单明细
    where 订单.订单ID=订单明细.订单ID and 订单明细.材料='不锈钢'
    时间:4秒select 订单.* 
    from 订单
    where 订单.订单ID=(Select 订单明细.订单ID from 订单明细
    where 订单明细.材料='不锈钢')
    时间:7秒
      

  5.   

    大批量数据和小批量数据的比较结果也许不一样,SQL Server的查询优化器的运行过程不清楚