Druid Geschrieben 31. März 2005 Geschrieben 31. März 2005 Hallo Forum, etwas für Logik Tüftler: Ich habe in meiner Datenbank zwei Tabellen. Beide sind nach dem gleichen Schema aufgebaut: ta_server_1 und ta_server_2 --------------------------- servername (string) la (integer) Menge (double) Ich möchte die beiden Tabellen miteinander inhaltlich vergleichen. D.h. ich habe eine Menge von la an Servername x in ta_server_1 und eine Menge von la an Servername x in ta_server_2. Ich habe es bis jetzt so gemacht: dim arr_errors(1 to 100, 1 to 3) as string sSQL = "select * from ta_server_1" set qdf = db.createQueryDef("", sSQL) set rs_tabelle1 = qdf.createRecordSet sSQL = "select * from ta_server_2" set qdf = db.createQueryDef("", sSQL) set rs_tabelle2 = qdf.createRecordSet while rs_tabelle1.eof = false while rs_tabelle2.eof = false if rs_tabelle1.fields(0).value = rs_tabelle2.fields(0).value then if rs_tabelle1.fields(1).value = rs_tabelle2.fields(1).value then if rs_tabelle1.fields(2).value <> rs_tabelle2.fields(2).value then sSQL = "insert into ta_delta (server, Menge1, Menge2) values ('" & rs_Tabelle1.fields(0).value & "..." docmd.runSQL end if end if end if rs_tabelle2.movenext wend rs_tabelle1.movenext rs_tabelle2.movefirst wend Damit habe ich alle Inhalte der Tabelle1 mit der Tabelle2 verglichen. Es gibt nur noch ein paar Probleme: 1. Wie finde ich heraus, wenn ein Server, der in Tabelle1 ist, gar nicht in Tabelle2 ist? 2. Gibt es eine effizientere Methode so etwas zu machen??? (bei 3000 Datensätzen pro Tabelle geht meine Performance langsam in den Keller) Wäre super genial, wenn Ihr mir helfen könntet!!! Gruß Druid :cool: Zitieren
Amstelchen Geschrieben 31. März 2005 Geschrieben 31. März 2005 servername (string) la (integer) Menge (double) nur so rein interessehalber, hast du primärschlüssel definiert bzw. aus welchen feldern setzen sich diese zusammen? 1. Wie finde ich heraus, wenn ein Server, der in Tabelle1 ist, gar nicht in Tabelle2 ist? SELECT ta_server_1.* FROM ta_server_1 LEFT JOIN ta_server_2 ON ta_server_1.servername = ta_server_2.servername WHERE (((ta_server_2.servername) Is Null)); sollte m.e. funktionieren (alle von 1 ohne übereinstimmung in 2). not in subselect sollte das genau gleiche ergebnis liefern, denke ich. SELECT ta_server_1.* FROM ta_server_1, ta_server_2 WHERE (([ta_server_1].[servername] Not In (select ta_server_2.servername from ta_server_2))); 2. Gibt es eine effizientere Methode so etwas zu machen??? (bei 3000 Datensätzen pro Tabelle geht meine Performance langsam in den Keller) primärschlüssel bzw. index definieren, sql-grundfunktionen nützen und mit möglichst wenig vba (if in if in if in schleife in schleife) auskommen. wenn du bei vba bleiben möchtest, probiere die verschiedenen datenzugriffsmethode von ado aus: adOpenKeyset, adOpenDynamic, adOpenStatic, adOpenForwardOnly, CursorLocation. forward only ist gewöhnlich am schnellsten. s'Amstel edit: achja, sei froh, 3000 datensätze ... bei 30 millionen ists erst so richtig lustig *fg* Zitieren
Druid Geschrieben 31. März 2005 Autor Geschrieben 31. März 2005 nur so rein interessehalber, hast du primärschlüssel definiert bzw. aus welchen feldern setzen sich diese zusammen? die tabellen sind natürlich ein bisschen aufwändiger. Meine Primärschlüssel setzen sich aus Servername und Seriennummer zusammen. primärschlüssel bzw. index definieren, sql-grundfunktionen nützen und mit möglichst wenig vba (if in if in if in schleife in schleife) auskommen. ich probier morgen in der Arbeit gleich mal deine Lösung mit den SubSelects aus. Dass das mit den verschachtelten ifs nicht die optimale ist war mich auch klar. Leider gabs für mich keine andere Lösung. Und mit welchen SQL - Grundfunktionen würde ich das hinbekommen? Zitieren
Druid Geschrieben 1. April 2005 Autor Geschrieben 1. April 2005 vom prinzip funktioniert es. Dann müsste ich doch mit folgendem Statement alle fehlenden Einträge bekommen: select ta_server_1.* from ta_server_1, ta_server_2 where (([ta_server_1].[servername] Not In (select ta_server_2.servername from ta_server_2)) wie kann ich obigen Code verändern, dass er mir Datensätze zurückgibt, die in Kombination aus servername und la in ta_server_2 nicht vorkommen? und mit folgendem Code müsste ich dann alle Differenzen bekommen? select ta_server_1.Servername, ta_server_1.la, ta_server_1.menge, ta_server_2.menge from ta_server_1, ta_server_2 where ta_server_1.servername = ta_server_2.servername AND ta_server_1.la = ta_server_2.la AND ta_server_1.menge <> ta_server_2.menge und dann nur noch per Schleife in die DB ta_delta schreiben: while rs.eof = false sSQL = "insert into ta_delta (servername, menge1, menge2) values ('" & _ "rs.fields(0).value & "', '" & rs.fields(1).value & ", " & rs.fields(2).value & ")" rs.movenext wend so müsste das ganze doch klappen, oder? Danke und Gruß Druid :cool: Zitieren
Druid Geschrieben 1. April 2005 Autor Geschrieben 1. April 2005 Alle die es interessiert: Mit Statement 1 kriege ich alle Server, die in Ta_Server_1, aber nicht in ta_server_2 sind. (--> Kombinationsschlüssel aus servername und la) select ta_server_1.* from ta_server_1 left join ta_server_2 ON ((ta_server_1.servername = ta_server_2.servername) AND (ta_server_1.la = ta_server_2.la)) where (((ta_server_2.servername) Is Null) OR (ta_server_2.la Is Null)); Mit Statement 2 kriege ich das ganze andersherum: select ta_server_2.* from ta_server_2 left join ta_server_1 ON ((ta_server_2.servername = ta_server_1.servername) AND (ta_server_2.la = ta_server_1.la)) where (((ta_server_1.servername) Is Null) OR (ta_server_1.la Is Null)) Und mit dem letzten Statement kriege ich die Differenzen der Mengen la an einem Server aus beiden Tabellen!! select ta_server_1.Servername, ta_server_1.la, ta_server_1.menge, ta_server_2.menge from ta_server_1, ta_server_2 where ((ta_server_1.servername = ta_server_2.servername) AND (ta_server_1.la = ta_server_2.la) AND (ta_server_1.menge <> ta_server_2.menge)) alles getestet --> läuft und liefert die richtigen Werte. Danke für den Denkanstoß Greetz Druid :cool: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.