SELECT distinct
   H1.FNumber + '-' + ISNULL(T2.FNumber,'') AS FID,
   H1.FNumber AS FMedicalServeDeptIDFNumber,
   H1.FName AS FMedicalServeDeptIDFName,
   T2.FName AS FMedicoIDFName,
   T1.FNumber AS FIatricIDFNumber,
   T1.FName AS FIatricIDFName,
   D.FMoney AS FMoney,
   D.FComeinMoney AS FCostMoney,
   (D.FMoney - D.FComeinMoney) AS FProfitMoney
FROM MZ_ChargeBillEntry D
   LEFT JOIN MZ_ChargeBill M ON M.FID = D.FID
   LEFT JOIN SMO_System_2013.dbo.Com_MedicalServeDept H1 ON H1.FID = M.FMedicalServeDeptID                   
   LEFT JOIN SMO_System_2013.dbo.Com_Regionalism H2 ON H2.FID = H1.FMRegionalismID
   RIGHT JOIN SMO_System_2013.dbo.Com_MerchArchive T1 ON T1.FID = D.FIatricID  AND T1.FItemFlag = 105002
   LEFT JOIN SMO_System_2013.dbo.Com_Medico T2 ON T2.FID = M.FMedicoID
WHERE H2.FNumber Like '37130401%' And H1.FID=5
    and (M.FDate>='2010-03-01 00:00:00' and M.FDate<='2013-03-31 23:59:59')
    这个SQL语句,只要加上那个 RIGHT JOIN 速度就会很慢,换成LEFT JOIN速度就很快。
如果换成 LEFT JOIN ,在Where 条件里加上对表 Com_MerchArchive T1 限制条件 AND T1.FItemFlag = 105002,速度也会很慢,实在找不出原因了,望各位高手指点下。谢谢SQL右连接

解决方案 »

  1.   

    right join 与 left join 是有区别的,不能随便乱换的
    速度慢可以检查一下索引是否建得合理了
      

  2.   

    建议在FDate、FNumber字段建立索引试试
      

  3.   

    主要是右连接 Com_MerchArchive 这个表慢,或者是一针对这个表加限制条件,速度就超慢,把这个表的连接去了,或者不针对这个表加限制条件速度就很快,但是这个表的数据量企业不大,只有几千条数据。
      

  4.   

    在SMO_System_2013.dbo.Com_MerchArchive表的FID建立索引试试。
      

  5.   

    我觉得你应该From 后面是否这个表:SMO_System_2013.dbo.Com_MedicalServeDept 
    然后再左连接其他表,一般以实际数据最多的那个作为主表查询.还有为什么你要用到distinct语句,这个语句也会导致查询变慢.
    你就试换个写法吧,如果还不行,建议你对H2.FNumber 和 M.FDate两个字段建索引
      

  6.   

    --#1.首先,你要了解LEFT JOIN和RIGHT JOIN的区别,还有条件放在ON和WHERE中的区别。
    --#2.把结果先放到表变量中,再JOIN: select FID,FNumber,FName from SMO_System_2013.dbo.Com_MerchArchive T1 where T1.FItemFlag = 105002
    --#3.其实,你可以查看一下你的执行计划,就明白原因啦!
      

  7.   


    这个方法对,我速度就是这么改善的,我看了执行执行计划,慢就慢在Com_MerchArchive这个表的连接上,如果用结果集去连就很快了,我也不知道啥原因,