/ /最大値以外のすべてのアクセスを削除する - sql、ms-access、ms-access-2007

最大値以外のすべてのアクセスを削除する - sql、ms-access、ms-access-2007

私は、重複している値と連結された値でいっぱいのAccessテーブル(contam)を整理しようとしています。

テーブルは次のようになります

FederalSiteIdentifier Contam
001 1
001 1, 2
001 1, 2, 3
001 1, 2, 3, 4
002 1
003 1
003 1, 2
003 1, 2, 3

私は各IDの最後のエントリを保持したいだけですが、Access SQLでこれを行う正しい方法を理解することはできません。

いくつかの読書をした後、私はこの単純なコードを試しました:

SELECT FederalSiteIdentifier, Max(Contam) as MaxCont
FROM contam
ORDER BY FederalSiteIdentifier

エラーが発生します。

誰も助けることができますか?

回答:

回答№1は0

私はあなたが Contam それぞれの値 FederalSiteIdentifier。あなたは GROUP BY 句。

SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont
FROM contam
GROUP BY FederalSiteIdentifier

その問合せで保管したい行が特定された場合は、 qryRows2Keep、これを試してみてください DELETE クエリ:

DELECT FROM contam
WHERE
Len(Contam) < DLookup(
"MaxCont",
"qryRows2Keep",
"FederalSiteIdentifier = "" & FederalSiteIdentifier & """)

私は仮定した FederalSiteIdentifier テキストデータ型です。数字の場合は、一重引用符を DLookup 表現。

この未確認の提案を試す前に、データをバックアップしてください。 :-)


回答№2の場合は0

MAXは集計関数です。これらはGROUP BYステートメントを使用する場合に使用します。アクセスはレコードを削除する方法も非常に特殊です。ジョインと削除のままにすることはできませんので、必要のないレコードを識別して削除する必要があります。

保存するレコードを選択できるように新しい列を作成します。

ALTER TABLE contam ADD Keep BIT NOT NULL DEFAULT 0;

レコードを識別してテーブルを更新する

UPDATE c
SET    keep = 1
FROM   contam AS c
INNER JOIN (
SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont
FROM contam
GROUP BY FederalSiteIdentifier
ORDER BY FederalSiteIdentifier
) AS maxc
ON c.FederalSiteIdentifier = maxc.FederalSiteIdentifier
AND Len(c.Contam) = maxc.MaxCont;

GROUP BY行に注意してください...あなたが逃したものはあなたにエラーを与えていました。

最後に削除を実行する

 DELETE FROM contam
WHERE keep = 0;

これで余分な列を削除することができます

ALTER TABLE contam DROP COLUMN Keep;

長い間風が吹かれましたが、そこに行きます。