2012-12-18 42 views
0

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

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

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

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的

回答

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) 
+0

这可能工作 - 但我不确定两件事:1.为什么'SELECT NULL',而不是'SELECT *'? 2.这是否包括在Accs中有0行的客户? – Craig

+0

@克雷格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将返回来自客户端无论所有记录如果在ACC的表通讯员。

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; 

但拉斐尔奥尔索斯的回答是最好的SQL,并且引擎知道用哈希来执行它加入(eventualy)。

+0

这看起来不错 - 但它是否会包含没有Accs行的客户? – Craig

+0

是的,你会得到所有的客户端,因为它是'left join',但是如果你在'select'子句中添加列,你需要在'group by'子句中添加它们 –