2016-07-28 50 views
0

我有一个包含exists子句的sql查询。以前有两个表之间的内部连接,但由于一些新的条件,我用存在子句替换了内部连接。下面是我的查询 -如何用sql server exists子句做优化?

SELECT id, 
     Count(id) AS 'ItemCount' 
FROM table1 t1 
WHERE (EXISTS(SELECT DISTINCT messageid 
       FROM table2 t2 
       WHERE t2.messageid = t1.chatmessageid 
         AND t2.receiverid = 'xyzo-1234' 
         AND t2.groupid = 'wxfx-1234' 
         AND (t1.userid = 'ttew-3457' 
           OR t1.userid IS NULL)) 
      OR (t1.userid = 'ttew-3457')) 
     AND (t1.machineid != 'C34F-A609') 
     AND (t1.createdtime > '2016-07-20 :: 07:21:51.9118534') 
     AND (t1.createdtime <= '2016-07-27 :: 13:25:30.1016155') 
     AND (t1.groupid = 'wxfx-1234') 
GROUP BY t1.id 
ORDER BY t1.id 

但这种查询花费多一点的时间比以前的查询,我想优化它更多。任何人都可以建议我如何更优化此查询?

+5

那么,对于初学者来说'DISTINCT'在'EXISTS'中是没有意义的,因为它所关心的是0行和0行以上的区别。 –

+0

'EXISTS(... OR t1.UserId IS NULL' - 你确定吗? –

+0

如果你有可以有NULL值的列,用类似'isnull(t1.UserId,'')' – xdd

回答

0
SELECT Id, COUNT(Id) as 'ItemCount' 
FROM table1 t1 WHERE (
        EXISTS( 
          ***SELECT Count 1 0 FROM table2 t2*** 
          WHERE t2.MessageId = t1.ChatMessageId AND t2.ReceiverId ='xyzo-1234' 
          AND t2.GroupId='wxfx-1234' 
          AND (t1.UserId ='ttew-3457' OR t1.UserId IS NULL) 
          ) 
       OR (t1.UserId ='ttew-3457') 
      ) 
     AND (t1.MachineId != 'C34F-A609') AND (t1.CreatedTime > '2016-07-20 :: 07:21:51.9118534') 
     AND (t1.CreatedTime <= '2016-07-27 :: 13:25:30.1016155') AND (t1.GroupId='wxfx-1234') 
GROUP BY t1.Id 
ORDER BY t1.Id 
+0

请使用代码格式化:) –