Hilfe von einem SQL Guru erbeten
Verfasst: 29.09.2021 16:51
Ich habe da ein kleines SQL Timing Problem.
1. Wie ist die Ausgangssituation
Ich habe eine Tabelle mit ID Daten und einigen noch leeren Feldern. Die ID Felder sind NICHT Unique. Das bedeutet diese können mehrfach vorkommen
2. Was mache ich
Ich zähle wie häufig eine ID in der Tabelle vorkommt und trage in einem zweiten Feld die Anzahl der Vorkommnisse ein. In einem dritten Feld trage ich einen Marker ein der mir signalisiert, "Diese ID habe ich schon abgearbeitet"
Hier mal ein Code Snippet dazuDas sollte sich selbst erklären
3. Das Problem
Das dauert ewig lange, da ich jeden Datensatz updaten muss
4. Was soll das ganze
Eine solche Tabelle ist mir vorgegeben und ich muss diese statistisch auswerten, also wie häufig kommt eine ID vor, muss das in die Tabelle eintragen um das Ergebnis später wieder auslesen zu können
5. Was könnt Ihr für mich tun
Mir dabei helfen das ganze Ding wesentlich zu beschleunigen. (Leider kann man mehrere UPDATE Bedingungen nicht in eine Befehlszeile zusammenfassen so wie das bei INSERT funktioniert. Zumindest habe ich dazu nichts gefunden)
Danke schon mal für die Unterstützung
1. Wie ist die Ausgangssituation
Ich habe eine Tabelle mit ID Daten und einigen noch leeren Feldern. Die ID Felder sind NICHT Unique. Das bedeutet diese können mehrfach vorkommen
2. Was mache ich
Ich zähle wie häufig eine ID in der Tabelle vorkommt und trage in einem zweiten Feld die Anzahl der Vorkommnisse ein. In einem dritten Feld trage ich einen Marker ein der mir signalisiert, "Diese ID habe ich schon abgearbeitet"
Hier mal ein Code Snippet dazu
Code: Alles auswählen
Procedure testdb()
Define i.i, Query.s, field1value.i, found.i
UseSQLiteDatabase()
;- ===== Create Test Database With 1 Table
CreateFile(0,"testdb.db3")
CloseFile(0)
OpenDatabase(0,"testdb.db3","","",#PB_Database_SQLite)
DatabaseUpdate(0,"CREATE TABLE testdb (field1 INTEGER,field2 INTEGER,field3 INTEGER,field4 INTEGER)")
;- ===== Fill Test Database
Query = "INSERT INTO testdb (field1,field2,field3,field4) VALUES ("
For i = 1 To 100
If Mod(i,10) = 0
Query + Str(i) + ",0,0,0),("
EndIf
Query + Str(i) + ",0,0,0),("
Next
DatabaseUpdate(0,Left(Query,Len(Query) - 2))
;- ===== Calculate Table (Recursive)
Query = "SELECT * FROM testdb WHERE field2 = 0"
DatabaseQuery(0,Query)
While NextDatabaseRow(0)
;- 1. Get field1 value
field1value = GetDatabaseLong(0,DatabaseColumnIndex(0,"field1"))
;- 2. Count Table entries with selected field1value
Query = "SELECT COUNT(*) FROM testdb WHERE field1 = " + Str(field1value) + " AND field2 = 0"
DatabaseQuery(0,Query)
NextDatabaseRow(0)
;- 3. Read count result
found = GetDatabaseLong(0,0)
;- 4. Write count result to field 3
FinishDatabaseQuery(0)
Query = "UPDATE testdb SET field2 = 1, field3 = " + Str(found) + ", field4 = 1 WHERE field1 = " + Str(field1value)
DatabaseUpdate(0,Query)
;- 5. Restart complete loop with values where field2 = 0 (this starts something like a rekursive While - Wend loop)
Query = "SELECT * FROM testdb WHERE field2 = 0"
DatabaseQuery(0,Query)
Wend
EndProcedure
testdb()3. Das Problem
Das dauert ewig lange, da ich jeden Datensatz updaten muss
4. Was soll das ganze
Eine solche Tabelle ist mir vorgegeben und ich muss diese statistisch auswerten, also wie häufig kommt eine ID vor, muss das in die Tabelle eintragen um das Ergebnis später wieder auslesen zu können
5. Was könnt Ihr für mich tun
Mir dabei helfen das ganze Ding wesentlich zu beschleunigen. (Leider kann man mehrere UPDATE Bedingungen nicht in eine Befehlszeile zusammenfassen so wie das bei INSERT funktioniert. Zumindest habe ich dazu nichts gefunden)
Danke schon mal für die Unterstützung