0

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

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

有没有更有效的方法来做到这一点?

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。

4

3 回答 3

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)
于 2012-12-18T06:21:49.470 回答
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 将返回来自 Clients 的所有记录,无论 Accs 表中是否有对应方。

于 2012-12-18T06:52:28.047 回答
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ël Althaus 的答案是最好的 SQL,并且引擎知道使用哈希连接(最终)执行它。

于 2012-12-18T07:05:15.690 回答