2016-05-02 4 views
0

Ich versuche 35 Jahre Daten in Access von Excel zu bringen. Ein Teil des Reinigungsprozesses ist sicherzustellen, dass die einzigartigen IDs, die wir für die gefangenen Tiere verwendet haben, für jedes Tier einzigartig sind.MS-Access 2007: Abfrage aller Datensätze, die Personen zugeordnet sind, die mindestens einen Datensatz haben, der die angegebenen Kriterien erfüllt

Um dies zu tun, möchte ich sicherstellen, dass jedes Tag nur eine "1st capture" zugeordnet ist. Ich kann nicht einfach nach Duplikaten suchen, weil Tiere oft 2-5 mal gefangen werden.

Jetzt habe ich es geschafft, diese Abfrage zu erstellen, die ID-Codes mit mehreren Capcode "1" Datensätze hochzieht. (Das Zeug über id.type ist, weil diese nur wichtig für die Tiere ist, die eine bestimmte Art und Weise markiert wurden)

SELECT [Capture Table].id_code, [Capture Table].capcode, 
    [Capture Table].id_type, [Capture Table].capture_id 
    FROM [Capture Table] 
    WHERE ((([Capture Table].id_code) In (SELECT [id_code] 
    FROM [Capture Table] As Tmp GROUP BY [id_code],[capcode] HAVING Count(*)>1 And [capcode] = [Capture Table].[capcode])) 
    AND (([Capture Table].capcode) Like "1") 
    AND (([Capture Table].id_type) Like "NP" Or ([All Info Query].id_type)="E" Or ([Capture Table].id_type)="T")) 
    ORDER BY [Capture Table].id_code, [Capture Table].capcode; 

Nun, das gibt mir die alle Tag-Nummern, die Probleme sind. Jetzt möchte ich sie mit all ihren zugehörigen Informationen (einschließlich Umfrage-Informationen aus Tabellen, die sich auf die Captures einer bestimmten Umfrage beziehen) ziehen UND alle Datensätze mit diesen ID-Codes zurückgeben (so ändere ich nicht nur die erste Aufnahme und vermisse sie nachfolgende Rückeroberungen).

Dies gibt die Datensätze (Sitzung + Header + Capture Query zieht nur alle Umfrage Informationen zusammen mit den zugehörigen Captures, so wie ich um den "mehrdeutigen Outer-Join-Fehler" bekam und kann immer noch das Datum & Website Info):

SELECT DISTINCTROW [Session+Header+Capture Query].Year, [Session+Header+Capture Query].site, [Session+Header+Capture Query].Date, [Session+Header+Capture Query].trappers, 
    [Session+Header+Capture Query].id_type, [Capcode 1 Repeat subQuery].id_code, [Session+Header+Capture Query].age, [Session+Header+Capture Query].sex, [Session+Header+Capture Query].repro, 
    [Session+Header+Capture Query].tail_mm, [Session+Header+Capture Query].capcode 
    FROM [Capcode 1 Repeat subQuery] LEFT JOIN [Session+Header+Capture Query] ON [Capcode 1 Repeat subQuery].id_code = [Session+Header+Capture Query].id_code; 

So gibt dies jetzt alle Datensätze zurück, die den "Problem-ID-Codes" zugeordnet sind. Sie werden jedoch auch dupliziert (obwohl eindeutige Datensätze aktiviert sind) und nicht aktualisierbar.

Lange Rede, kurzer Sinn, wie kann ich Duplikate mit bestimmten Kriterien auswählen (doppelte ID-Codes mit Capcode = 1) und alle Datensätze mit diesen ID-Codes zurückgeben, nicht nur diejenigen mit Capcode = 1? Während meine Abfrage noch aktualisierbar ist?

Es ist wie die Art und Weise scheint dies zu tun wäre, um die Unterabfrage zu entfernen und setzt nur die Auswahlfunktion in das Haupt, aber ich "bin nicht sicher, wie das zu tun, und die Capcode Kriterien in dem klappen.

Vielen Dank für die Hilfe!

PS. ich bin immer noch nur SQL lernen, so kleine Erklärungen in Antworten zusammen mit Code sind wirklich sehr hilfreich, sonst ich kopieren und einfügen und versuchen, einfach nicht zu brechen.

+0

Da eine Abfrage als Quelle für eine andere Abfrage verwendet werden kann, versuche ich, komplexe Logik in mehrere einfachere Abfragen zu trennen. In diesem Fall würde ich eine Abfrage schreiben, um die Problem-IDs zu identifizieren, und dann dieses Ergebnis in einer zweiten Abfrage verwenden, um alle zugehörigen Datensätze mit dieser ID zu erhalten. –

+0

Das habe ich. Es ist jedoch nicht aktualisierbar, was ein Problem darstellt, da ich die Datensätze hochfahre, weil sie geändert werden müssen, und es gibt über tausend davon mit über 300 IDs. Ich wollte nicht für jede ID selbst filtern, um sie zu aktualisieren. Aber ich denke, ich habe es herausgefunden, aber du hast Recht, meine Antwort war nicht schön und sah ziemlich kompliziert aus. Ich poste es zum Teilen. – user2934942

Antwort

0

Also habe ich herausgefunden, wie ich das machen soll, ich poste es hier, damit andere mein seltsames Durcheinander (auf eigene Gefahr) ausprobieren können, oder so Die erfahrenen Leute können meine beste Schätzung darüber verbessern, wie das geht.

Ich schrieb die zwei Abfragen getrennt. Das Erste macht das, was mein Original zuerst tut, zieht alle Problem-IDs hoch. Die zweite zieht alle damit verbundenen Datensätze hoch. Die zweite zieht auch die Information direkt aus den drei verwandten Tabellen anstatt aus der Abfrage, wo alles kombiniert ist, was ich vorher nicht wusste.

Wie auch immer, ich kombinierte Abfrage 1 & Abfrage 2 in eine einzige Abfrage, indem Abfrage 1 in seiner Gesamtheit in der WHERE-Klausel von Abfrage 2 platziert, so Abfrage 2 Datensätze nur aus den Ergebnissen der Abfrage 1 gezogen. Jede "Abfrage" ist mehr eingerückt im folgenden Code.

Vorschläge, wie dies verbessert werden kann, sind sehr willkommen.

+0

Sie könnten die erste Abfrage nehmen und sie in eine Abfrage "Tabelle erstellen" ändern - ich denke, dies würde ermöglichen, dass die zweite Abfrage basierend auf der neuen Tabelle editierbar ist. –

Verwandte Themen