• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

sqlite über zwei Datenbanken

Krolock

Geocacher
Hallo,
weiß jemand ob es bei GSAK (im Makro) möglich ist eine SQL-Abfrage über zwei Datenbanken durchzuführen.
Für ein effektives Project81-Macro schwebt mir folgendes vor:

Code:
SELECT * FROM CACHES c WHERE NOT EXISTS ( SELECT * FROM $foundDB f WHERE c.difficulty = f.difficulty and c.terrain = f.terrain

Ich sehe nur noch keine Möglichkeit zwei Datenbanken (default & foundDB) zu verknüpfen. Die eine enthält die noch nicht, die andere die gefundenen Caches und ich möchte alle Caches filtern, die mir noch fehlen.

Bevor ich jetzt mit Alternativantworten zugebombt werde: Ja, ich weiß, dass es bereits fertige Macros gibt, die so was auflisten, aber ich habe a) keins gefunden, dass einfach nur filtert und b) interessiert es mich auch ohne konkretes Einsatzgebiet, ob man zwei Datenbanken kombinieren kann.

Bisher iteriere ich über die foundDB und stecke alle gefundenen Kombis in ein Array. Anschließend markiere ich alle nicht gefundenen Kombis in der defaultDB und filtere auf FilterFlagSet.
Eine Alternative wäre eine temporäre Datenbank als Vereinigung von default und foundDB, aber vllt geht es auch einfacher.
 
OP
Krolock

Krolock

Geocacher
Nach langer langer Zeit konnte ich die vielen vielen Klippen des Attachens umschiffen und kann folgenden Beispielcode repräsentieren
Code:
DATABASE Name="$cacheDB" action="select"

# Build path to second database
$path = RegExData(".*(?=.*\\)",$_CurrentDataPath,1)
$path = $path + "\$foundDB\Sqlite.db3"
$sqlInputFile = SqlQuote($path)

# Attach database
$_sql ="ATTACH $sqlInputFile AS myFoundDB"
$status = Sqlite("sql",$_sql)

# select all gc codes from default database which exists in second database and store it in a tmp table
$_sql="CREATE TEMP TABLE codesToFound AS SELECT c.Code FROM caches c JOIN myFoundDB.Caches f ON c.Code = f.Code"
$status = Sqlite("sql",$_sql)

# select all caches matching the select above
mfilter where=Code IN (SELECT Code from codesToFound)

# detach second database
$_sql = "DETACH myFoundDB"
$status = Sqlite("sql",$_sql)

Das Abspeichern der Werte in einer temporären Tabelle war nötig, da GSAK ansonsten nach dem Beenden des Macros abgestürzt ist, wenn ich den mfilter auf
Code:
 mfilter where=Code in (SELECT c.Code FROM caches c LEFT OUTER JOIN myFoundDB.Caches ...
gesetzt wurde
 

adorfer

Geoguru
Vielen Dank für's Dokumentieren!
(Dass es "irgendwie mit ATTACH geht", das wusste ich zwar, aber da sind ja doch noch ein paar Klippen...)
 
Oben