SQL查询太慢了

时间:2012-12-18 06:14:28

标签: sql sql-server-2008 query-optimization

我要求只选择没有交易的客户,否则他们的最后一笔交易是在特定日期之后。

目前,我的查询花了太长时间。

有更有效的方法吗?

SELECT *, 
   (SELECT MAX(AC_CLOSEDDAT) FROM 
    Accs WHERE accs.AC_CLIENTCODE = c.CL_CLIENTCODE) AS LastTrans 
FROM Clients c 
WHERE CL_STATUS <> 'R' 
AND STORE_CODE = '69JX

我希望我可以使用JOIN,但不确定....我需要没有交易的客户,以及过去2年内交易的客户。

使用SQL Server 2008。

3 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS子句,它将在给定日期之后为您提供空事务或无事务的结果,而无需任何最大值。

SELECT * FROM Clients c
WHERE CL_STATUS <> 'R'
AND STORE_CODE = '69JX'
AND NOT EXISTS 
    (SELECT NULL FROM Accs a
    WHERE a.AC_CLIENTCODE = c.CL_CLIENTCODE
    AND a.AC_CLOSEDDAT > theDateToCompare)

答案 1 :(得分:0)

好吧,你可以使用JOIN,只需它是LEFT JOIN:

SELECT c.*, MAX(AC_CLOSEDDAT) AS LastTrans
    FROM Clients c 
    LEFT JOIN Accs ON accs.AC_CLIENTCODE = c.CL_CLIENTCODE 
WHERE CL_STATUS <> 'R' 
    AND STORE_CODE = '69JX

使用LEFT JOIN将返回来自客户的所有记录,无论Accs表中是否有通讯员。

答案 2 :(得分:0)

通过加入,您可以:

SELECT c.client_id
FROM Clients c 
LEFT JOIN  Accs a
  on (a.AC_CLIENTCODE = c.CL_CLIENTCODE AND 
      a.AC_CLOSEDDAT >= DATEADD(year,-2,GETDATE())
WHERE CL_STATUS <> 'R'
AND STORE_CODE = '69JX'
group by c.client_id;

但RaphaëlAlthaus的答案是最好的SQL,引擎知道用散列连接(eventualy)执行它。