私は、重複している値と連結された値でいっぱいの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;
長い間風が吹かれましたが、そこに行きます。