2017-02-08 14 views
2

私は抽出日の異なる以下のコーステーブルを持っています。SQL NOT IN MS ACCESS/VBAのクエリ

ID | Course | ExtractDate 
10 | 100000 | 2017-02-28 
10 | 100001 | 2017-01-31 
10 | 100002 | 2016-12-31 
10 | 100003 | 2016-11-30 

私は、最新の3ヶ月からのレコードのみを維持するために、次のSQLスクリプトを実行する必要があり、それゆえ10003

Delete from [Course] where [ExtractDate] not in (select distinct top 3 [ExtractDate] from [Course] order by [ExtractDate] desc 

は、VBAやMSアクセスがないように思えコースコードでレコードを削除します誰かがこれのための任意の回避策を持っています "ではない"機能をサポートしていますか?

ありがとうございます。

+0

本当に最後の3か月ですか?より古い日付のレコードを削除することができます。それも速いでしょう。 dateadd関数を見てください(ヒント、マイナスの値は減算されます) – Hogan

+0

Access SQLはうれしく 'NOT IN'をサポートしています。あなたの問題は、あなたが 'distinct'と' top'を一緒に使うことです。これはAccess SQLによるものです:https://msdn.microsoft.com/en-us/library/bb177882(v=office.12)。 aspx – cha

+0

実際に私は前に2を試してみましたが、動作しません。 (1)削除する[Course] DateAdd( 'm'、3、ExtractDate) 3 – user1688194

答えて

0

あなたは3ヶ月よりも古いレコードの場合:

Delete from [Course] 
    where [ExtractDate] < dateadd("m", -3, date()); 

を何セットベースの操作は必要ありません。

+0

私はちょうど試みたが、それは動作していないようです。不要なレコードは削除されません。それはSQLサーバーでうまくいきます。私は、MS ACCESS 2016でサポートされていないDATEADD/DATEDIFF関数かどうかを考えています。 – user1688194

+0

@ user1688194 。 。 'dateadd()'は間違いなくMS Access(https://www.techonthenet.com/access/functions/date/dateadd.php)にあります。 –

+0

ああ、レコードを削除しないように私が作ったばかげたミスがあった。それはすでに今働いています。ありがとうございました! – user1688194

0

NOT INは、ターゲットがnullである場合参加左と同じである(従ってない参加がなかった)

SO ...

from [Course] 
where [ExtractDate] not in (
    select distinct top 3 [ExtractDate] 
    from [Course] 
    order by [ExtractDate] desc 
) 

from [Course] 
left join (
    select distinct top 3 [ExtractDate] 
    from [Course] 
    order by [ExtractDate] desc 
) as x on [ExtractDate] = x.[ExtractDate] 
where x.[ExtractDate] is null 
と同じです

しかし、私はあなたのコードが正しいと主張しません - その2つはSQLで同じです。

+0

これはselect文の場合に機能します。しかし、私は条件に該当するレコードを削除する必要があります。 – user1688194