2016-06-27 10 views
0

Ich versuche, eine Legacy-Anwendung zu optimieren, die Access als Datenbank verwendet. Das Problem mit einigen der Abfragen ist, dass sie nach Stunden nichts zurückgeben. Ich versuche, das Problem durch Hinzufügen von Joins nacheinander zu lösen. Jetzt wurde ich mit einer der Abfragen getroffen, da sie nichts zurückgeben und für immer ausgeführt werden. Die Abfrage verhält sich nach dem Hinzufügen der linken Verknüpfung, die SubQueries verwendet, um die Daten zu erhalten.
Anregungen herzlich geschätzt würde ..Access Query führt für immer

Antwort

1

Das Verbinden mit einer aggregierten Spalte (MaxOfColumn) funktioniert wahrscheinlich nicht gut.

Ich schlage vor: fügen Sie das Ergebnis von [qry Aggregate Query] in eine temporäre Tabelle ein. Verknüpfen Sie diese Tabelle stattdessen in Ihrer problematischen Abfrage.

Sie können dafür eine SELECT INTO-Abfrage (und löschen Sie die alte temporäre Tabelle) oder eine INSERT INTO-Abfrage verwenden (und die temporäre Tabelle vorher leeren).

bearbeiten
Sobald Sie es im Prinzip arbeiten haben, schlage ich eine Anfügeabfrage (INSERT INTO) mit Abfrage statt einer Tabelle erstellen.

So bleibt Ihre temporäre Tabelle an Ort und Stelle, und Sie können Indizes für die Felder hinzufügen, die Sie für JOINs verwenden, um die Leistung weiter zu verbessern.

die Hauptabfrage zu öffnen, tun Sie dann in VBA:

' Empty temp table 
CurrentDb.Execute "DELETE * FROM Temptable" 
' Run Append query 
CurrentDb.Execute "NameOfYourAppendQuery" 
' Open main query 
DoCmd.OpenQuery "MainQuery" 
+0

@Lara: Lesen Sie, probieren Sie es aus. Es ist nicht so schwer. Abfragetypen: http://www.fmsinc.com/tpapers/queries/#Action_Queries. Erstellen Sie eine Kopie von '[Qry List ASDT tbl ASDT P1T_AGENT_STAFF Aktiv MAX ENDDATE]', ändern Sie es in eine ** Tabelle erstellen ** Abfrage. Starte es. Verwenden Sie stattdessen die resultierende Tabelle in Ihrer Hauptabfrage. – Andre

+0

Danke für den Link Andre.Ich erstellte und führe Make Table.Now in der Abfrage aus. Sollen Joins wie 'LINKE VERBINDUNG [MakeTableName] ON [tbl ADW] .H10_STAFF_PARTY_ID = [MakeTableName] .STF_STAFF_PARTY_ID)' erfolgen. Ist es der richtige Weg? – Lara

+0

@Lara: Ja, wo immer Sie gerade '' haben ASDT tbl ASDT P1T_AGENT_STAFF Active MAX ENDDATE] ', ersetzen Sie es durch' [MakeTableName] '. – Andre

1

Versuchen Hinzufügen von Indizes zu den Tabellen auf diesen Säulen:

[tbl ASDT P1T_AGENT_STAFF] - (STF_END_EFF_DT) 
[qry List ASDT tbl ASDT P1T_AGENT_STAFF Active MAX END DATE] - (maxOfSTF_END_EFF_DT) 

Obwohl es scheint, wie Sie sind nicht einmal diese Spalte, Sie es bereits auf maxOfSTF_END_EFF_DT zur Verfügung haben Warum also zu diesem Tisch?

+0

I 'STF_END_EFF_DT' Column.'STF_END_EFF_DT' ist bereits ein Index und' qry Liste ASDT Tabl ASDT P1T_AGENT_STAFF Aktiv MAX END zu bekommen am Beitritt DATE' ist Unterabfrage .. Irgendetwas, das ich hier vermisse? – Lara

+0

Aber ist nicht 'STF_END_EFF_DT' =' maxOfSTF_END_EFF_DT'? Sie haben diese Information bereits. – sagi

Verwandte Themen