1

重複および連結された値でいっぱいのAccessテーブル(汚染)を整理しようとしています。

テーブルはこんな感じ

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の最後の(最長の)エントリのみを保持したいのですが、AccessSQLでこれを行う適切な方法を理解できません。

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

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

エラーが発生します。

誰か助けてもらえますか?

4

2 に答える 2

0

Contamそれぞれの値の最大長が必要だと思いますFederalSiteIdentifierGROUP BY条項が必要になります。

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

そのクエリが保持したい行を識別した場合は、それをqryRows2KeepDELETEとして保存してから、次のクエリを試してください。

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

FederalSiteIdentifierはテキストデータ型だと思いました。数値の場合は、DLookup式から一重引用符を破棄します。

このテストされていない提案を試みる前に、データをバックアップしたことを確認してください。:-)

于 2013-01-09T18:23:04.577 に答える
0

MAXは集計関数であり、GROUPBYステートメントを使用する場合にのみこれらを実行できます。アクセスは、レコードを削除できるという点でも非常に独特です。結合と削除を離れることはできないため、不要なレコードを特定してから削除する必要があります。

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

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;

GROUPBY行に注意してください...それはあなたがあなたにエラーを与えていたのを見逃したものです。

最後に削除を実行します

 DELETE FROM contam
 WHERE keep = 0;

これで、余分な列を削除できます

ALTER TABLE contam DROP COLUMN Keep;

長い風が吹いていますが、そこに行きます。

于 2013-01-09T18:23:33.303 に答える