我要求只选择没有交易的客户,否则他们的最后一笔交易是在特定日期之后。
目前,我的查询花了太长时间。
有更有效的方法吗?
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。
答案 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)执行它。