2009-04-20 33 views
0

Ich habe eine App, die SQLite verwendet, um Daten lokal zu speichern. Es kann mehr als eine Datei geben, die die Daten speichert. Alle Dateien enthalten eine Liste von Elementen, aber nur einer von ihnen hat den "korrekten" Status für den aktuellen Benutzer (im Grunde gibt es eine "Benutzer" -DB in $ HOME und eine "systemweite" in/etc).Spezifische "Version" einer Spalte abrufen

Normalerweise enthalten beide Dateien die gleiche Liste von Elementen, und nur die Statusspalte unterscheidet sich. Wenn jedoch beide Elemente nicht in beiden enthalten sind, möchte ich auch diese Daten.

SQLite verfügt nicht über FULL OUTER JOIN.

Eine Lösung, die ich mit gekommen sind, ist dies:

SELECT item, group_concat(status) AS status FROM (SELECT item,status FROM items UNION SELECT item,status FROM otherdb.items) GROUP BY item; 

Und dann die kommagetrennten Ausgang „Status“ Parsen der „richtigen“ Status zu erhalten. Ich möchte jedoch eine reine SQL-Lösung.

Die Werte, die ich für den Status wollen, sind:

If any = 1, status = 1 
elif any = -1, status = -1 
elif any = 2, status = 2 
elif any = -2, status = -2 
else status = 0 or NULL 

Status nur kann (in der db) -2 sein, -1,0, NULL, 1,2 so deckt diese alle Daten.

Wenn es eine Lösung gibt, die nur den Wert ungleich null und nicht null gibt, könnte das auch funktionieren, obwohl ich das obige bevorzugen würde.

Antwort

1

Ich würde Ihnen einen Ansatz sugest:

1. Erstellen Sie eine temporäre Tabelle, eine adittional Spalte für einen Flag "otherbd";
2. wirf alles von den 2 Tischen hinein;
3. löschen Sie die Zeilen, die Sie nicht möchten;

1

eine Status Priorität Tabelle erstellen mit den folgenden Werten

status priority 
    1  5 
-1  4 
    2  3 
-2  2 
    0  1 
NULL  0 

Das Konzept ist Ihre zwei Tabellen an dieser StatusPriorty Tabelle, die Einträge zu verbinden und verwendet MAX (Priority) Ihre Ergebnisse zu erhalten