2008-08-22 10 views
0

OK, hier ist mein Problem, ohne zu spezifisch zu sein, aus Gründen der gefeuert werden, um Unternehmenspraktiken ins Internet zu setzen.Wie man durch 2 Felder beim Laden von Daten in eine Zugriffsdatenbanktabelle von einer Excel-Tabelle

Es sind Tabellenkalkulationen gemacht. Diese werden in die Datenbank hochgeladen. Ich muss Duplikate vom Hochladen filtern. Der einzige Weg, dies zu tun, besteht darin, sicherzustellen, dass für jeden einzelnen Eintrag, dass zwei Felder nicht dieselben sind wie ein bereits in der Datenbank vorhandener Eintrag. Da gerade ein Feld dasselbe ist, bedeutet es nicht, dass es ein Duplikat ist. Es gibt zwei spezifische Felder, die man FLDA und FLDB nennen kann, die beide mit einem Eintrag in der Datenbank übereinstimmen müssen. Ich kann schon nach einem Feld filtern. Ich denke, das muss eine Unterabfrage sein, aber ich bin mir nicht sicher, wie ich es anwenden soll. Das ist schwer zu beschreiben. Fragen Sie einfach, ob Sie nicht sicher sind, was ich meine.

Antwort

1

Ich hatte ein ähnliches Problem. Meine Lösung war:

  1. importieren in eine Staging-Tabelle.
  2. löschen Sie die Duplikate
  3. Kopie, was über in die Live-Tabelle noch übrig ist

Es ist ein wenig BFI, aber es einfach nur funktioniert.

0

Aufbauend auf der Antwort von CodeSlave bietet Access einen Suchduplex-Abfrageassistenten, der Ihnen beim einfachen Erstellen der Abfrage helfen kann, um die Duplikate zu entfernen.

Ein anderer Ansatz wäre, eine Identität auf FLDA und FLDB einzurichten. Dies verhindert, dass doppelte Einträge sogar in die Tabelle geschrieben werden. Natürlich müssen Sie auch die Ausnahme abfangen, die ausgelöst wird, wenn die Einfügeoperation fehlschlägt.

1

Wäre eine Abfrage geeignet? Zum Beispiel:

INSERT INTO ToUpdate (Field1, Field2) 
SELECT e.H1, e.H2 
FROM (SELECT * FROM [Sheet1$] IN '' [Excel 8.0;HDR=YES;IMEX=1;database=C:\Docs\LTD.xls]) As e 
LEFT JOIN ToUpdate ON (e.H2 = ToUpdate.Field2) AND (e.H1 = ToUpdate.Field1) 
WHERE ToUpdate.Field1 Is Null AND ToUpdate.Field2 Is Null 
0

Gibt es ein Feld FLDC, das für das Identifizieren von Duplikaten anders wäre? Ich nehme an, dass es da sein muss, da sonst (FLDA, FLDB) als eindeutiger oder primärer Schlüssel Ihr Problem sofort lösen würde.

Angenommen, es ist ein solches Feld, könnten Sie so etwas wie dies versuchen:

SELECT T1.FLDA, T1.FLDB, T1.FLDC 
FROM Table1 T1, Table1 T2 
WHERE T1.FLDA = T2.FLDA 
    AND T1.FLDB = T2.FLDB 
    AND T1.FLDC <> T2.FLDC 

Der Nachteil dabei ist, dass sowohl das Original und das Duplikat wird durch so etwas wie dies zurückgegeben werden. Wenn Sie nur die Duplikate sehen wollen, müssen Sie wahrscheinlich einen Weg finden, um eine 'ursprüngliche' Zeile zu identifizieren und eine weitere WHERE-Klausel oder zwei dafür hinzuzufügen.

Wenn Sie eine Abfrage erhalten, die Ihnen nur die doppelten Zeilen und nicht die Originale gibt, sollte es ziemlich einfach sein, es in eine DELETE-Abfrage zu ändern.

0

Um Duplikate auf Importe zu vermeiden:

1 - Wenn es gibt nicht bereits ein Primärschlüssel auf den Tisch, legte man auf FLDA und FLDB (zusammen). Wenn es bereits einen Primärschlüssel gibt, der nicht FLDA und FLDB (zusammen) ist, platzieren Sie einen Index für die Tabelle in diesen beiden Feldern, unique yes, ignore nulls no.

2 - Sie können mit dem Assistenten oder mit einer Abfrage aus der Tabelle in die Tabelle importieren. Wenn Sie es mit dem Import-Tabelle Assistenten tun, werden Sie diese Nachricht vor dem Import beginnt zu sehen:

„DB Name nicht in der Lage war, alle Daten an die Tabelle anfügen

.“ Der Inhalt der Felder in 0 Datensätze wurden gelöscht und (xx) Datensätze gingen aufgrund von Schlüsselverletzungen verloren. (Diese verlorenen Aufzeichnungen waren Dubletten, also kein echter Verlust gibt.) ... Haben Sie trotzdem fortfahren möchten?“

Klicken Sie auf Ja, um die Zeilen aus der Tabelle zu importieren. Keine Duplikate importiert werden.

Or (.:;: view> SQL-Ansicht Menü einfügen> Abfrage> Entwurfsansicht, Schließen-Taste Menü)

INSERT INTO tblInput 
    SELECT XLS.* 
    FROM tblInput AS T RIGHT JOIN 
    [Excel 8.0;IMEX=1;HDR=Yes;DATABASE=c:\data.xls;].[Sheet1$] AS XLS 
    ON T.FLDA = XLS.FLDA AND T.FLDB = XLS.FLDB 
    WHERE ISNULL(T.FLDA) AND ISNULL(T.FLDB); 

ändern Sie den Pfad, eine Abfrage für die Einfuhr, fügen Sie diese in eine neue Abfrage in SQL-Ansicht verwenden c: \ data.xls, zu Ihrem Pfad, Sheet1 $ zu Ihrem Blattnamen, tblInput zu Ihrem Tabellennamen und FLDA und FLDB zu Ihren Spaltennamen Wenn die Tabelle keine Kopfzeilen (Spaltennamen) hat, ändern Sie HDR = Y es zu HDR = Nein

0

Ich tat dies mit einer Löschabfrage und dann mit Select from Table 1 Group by X Having Y, Z, A. Und dann habe ich Run-Abfrage-Taste für Front-End-Benutzer.

Prost für all Ihre Hilfe.