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年以内にトランザクションのあるクライアントが必要です。

SQLServer2008の使用。

4

3 に答える 3

1

NOT EXISTS句を使用すると、最大値を必要とせずに、nullトランザクションまたは特定の日付以降のトランザクションなしの結果が得られます。

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を使用できますが、LEFTJOINである必要があります。

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テーブルにコレスポンデントが存在するかどうかに関係なく、クライアントからすべてのレコードが返されます。

于 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ëlAlthausの答えは最良のSQLであり、エンジンはハッシュ結合(最終的に)でそれを実行することを知っています。

于 2012-12-18T07:05:15.690 に答える