2009-04-20 7 views
0

J'ai une application qui utilise SQLite pour stocker des données localement. Il peut y avoir plus d'un fichier stockant les données. Tous les fichiers contiennent une liste d'éléments, mais un seul d'entre eux a le statut "correct" pour l'utilisateur actuel (en gros, il y a un utilisateur "db" dans $ HOME et un "système" dans/etc).Obtenir la "version" spécifique d'une colonne

Habituellement, les deux fichiers contiendront la même liste d'éléments, et seule la colonne d'état sera différente. Si, cependant, l'un ou l'autre contient des éléments qui ne sont pas dans les deux, je veux aussi ces données.

SQLite ne possède pas FULL OUTER JOIN.

Une solution que je suis venu avec c'est:

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

Et puis l'analyse de la sortie séparés par des virgules « état » pour obtenir le statut de « droit ». Je voudrais cependant une solution SQL pure.

Les valeurs que je veux pour le statut sont:

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 

statut ne peut (dans la db) de -2, -1,0, NULL, 1,2 donc cela couvre toutes les données.

S'il y a une solution qui donne seulement celle qui est différente de zéro et non nulle, cela pourrait fonctionner aussi, bien que je préférerais ce qui précède.

Répondre

1

Je vous sugest une approche:

1. Créez une table temporaire, une colonne adittional pour un drapeau "otherbd";
2. jeter tout de les 2 tables là-bas;
3. supprimez les lignes que vous ne voulez pas;

1

Créer une table de priorité d'état avec les valeurs suivantes

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

Le concept est de joindre vos deux tables contre ce tableau StatusPriorty, groupe les dossiers et utiliser pour obtenir vos résultats MAX (priorité)

Questions connexes