SQLite - Comment joindre des tables à partir de différentes bases de données?

100

J'ai une application qui utilise une base de données SQLite et tout fonctionne comme il se doit. Je suis actuellement en train d'ajouter de nouvelles fonctionnalités qui nécessitent une deuxième base de données SQLite, mais j'ai du mal à comprendre comment joindre des tables à partir des différentes bases de données.

Si quelqu'un peut m'aider avec celui-ci, je l'apprécierais vraiment!

Modifier: Voir cette question pour un exemple de cas que vous pouvez adapter à votre langue lorsque vous attachez des bases de données comme mentionné dans la réponse acceptée.

Adam Smith
la source
À quoi ressemble la base de données? Existe-t-il des colonnes communes qui peuvent être utilisées pour les joindre? Les colonnes pour chacun sont-elles les mêmes de sorte que vous puissiez utiliser une union? sqlite.org/syntaxdiagrams.html
Alex R.
Oui, certaines colonnes peuvent être jointes à l'aide du mot clé USING car elles portent le même nom. Mon problème n'est pas que je ne sais pas comment rejoindre puisque mon programme le fait déjà fréquemment sur des tables de la même base de données, c'est que je n'arrive pas à trouver comment lier les deux bases de données afin que les données de l'une soient utilisables de l'autre ( comme une jointure, par exemple)
Adam Smith
Exemple: la première base de données possède une table appelée "planning", elle contient, entre autres colonnes, une colonne de date, un identifiant d'équipe et un numéro de voie. La deuxième base de données a une table qui garde des traces des scores entrés par les utilisateurs pour leur jeu d'équipe. Cette table a donc également une date et un teamID. Je veux les rejoindre en utilisant ces deux colonnes pour savoir sur quelle voie chaque équipe est censée jouer. Il y a d'autres tables qui devront être jointes à d'autres fins, mais vous pouvez avoir une idée de ce dont j'ai besoin à partir de cet exemple.
Adam Smith

Réponses:

127

Si ATTACH est activé dans votre build de Sqlite (il devrait l'être dans la plupart des builds), vous pouvez attacher un autre fichier de base de données à la connexion actuelle à l'aide du mot clé ATTACH . La limite du nombre de bases de données pouvant être jointes est un paramètre de temps de compilation ( SQLITE_MAX_ATTACHED ), actuellement par défaut à 10, mais cela peut également varier en fonction de la version que vous avez. La limite globale est de 125.

attach 'database1.db' as db1;
attach 'database2.db' as db2;

Vous pouvez voir toutes les bases de données connectées avec le mot-clé

.databases

Ensuite, vous devriez pouvoir effectuer les opérations suivantes.

select
  *
from
  db1.SomeTable a
    inner join 
  db2.SomeTable b on b.SomeColumn = a.SomeColumn;

Notez que « [l] es noms de base de données mainet tempsont réservés à la base de données primaire et base de données pour les tables temporaires et d' autres objets de données temporaires. Ces deux noms de bases de données existent pour chaque connexion de base de données et ne doit pas être utilisé pour la fixation ».

Brian Gideon
la source
2
L'utilisateur StanleyD a noté que cela ne fonctionnait pas pour lui tant qu'il n'a pas mis '(guillemets simples) autour du nom du fichier. J'ai trouvé la même chose.
bkribbs le
4

Voici un exemple C # pour répondre à cette question

/// <summary>
/// attachSQL = attach 'C:\\WOI\\Daily SQL\\Attak.sqlite' as db1 */
/// path = "Path of the sqlite database file
/// sqlQuery  = @"Select A.SNo,A.MsgDate,A.ErrName,B.SNo as BSNo,B.Err as ErrAtB from Table1 as A 
///                    inner join db1.Labamba as B on 
///                    A.ErrName = B.Err";
/// </summary>
/// <param name="attachSQL"></param>
/// <param name="sqlQuery"></param>
public static DataTable GetDataTableFrom2DBFiles(string attachSQL, string sqlQuery)
{
    try
    {
        string conArtistName = "data source=" + path + ";";
        using (SQLiteConnection singleConnectionFor2DBFiles = new SQLiteConnection(conArtistName))
        {
            singleConnectionFor2DBFiles.Open();
            using (SQLiteCommand AttachCommand = new SQLiteCommand(attachSQL, singleConnectionFor2DBFiles))
            {
                AttachCommand.ExecuteNonQuery();
                using (SQLiteCommand SelectQueryCommand = new SQLiteCommand(sqlQuery, singleConnectionFor2DBFiles))
                {
                    using (DataTable dt = new DataTable())
                    {
                        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(SelectQueryCommand))
                        {
                            adapter.AcceptChangesDuringFill = true;
                            adapter.Fill(dt);
                            return dt;
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Use Process Exception method An error occurred");
        return null;
    }

}
Dr Sai
la source
1

Eh bien, je n'ai pas beaucoup d'expérience avec SQLite, vous devez accéder aux deux bases de données en une seule requête.

Vous pouvez avoir quelque chose comme:

select name from DB1.table1 as a join DB2.table2 as b where a.age = b.age;

Dans les bases de données comme SQLServer, vous pouvez accéder à d'autres bases de données de cette manière hiérarchique, cela devrait également fonctionner pour SQLite.

Je pense que vous pouvez lancer une instance de sqlite avec plus de 1 bases de données!

Yugal Jindle
la source
Oui, j'ai vu la documentation du serveur SQL, mais je n'ai pas trouvé la requête équivalente pour SQLite. Le problème avec cette requête est que j'utilise un gestionnaire de pilote pour créer ma connexion, donc j'ai deux objets de connexion qui pointent vers les fichiers de la base de données, mais faire conn1.table ne semble pas fonctionner pour une raison quelconque.
Adam Smith