web-dev-qa-db-fra.com

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

J'ai une application qui utilise une base de données SQLite et tout fonctionne comme il se doit. Je suis en train d'ajouter de nouvelles fonctionnalités nécessitant une deuxième base de données SQLite, mais j'ai du mal à comprendre comment joindre des tables de 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, vous pouvez vous adapter à votre langue lorsque vous attachez des bases de données comme indiqué dans la réponse acceptée.

91
Adam Smith

Si ATTACHEZ est activé dans votre version de Sqlite (il devrait être en most ), vous pouvez attacher un autre fichier de base de données à la connexion actuelle en utilisant le mot-clé ATTACH . Le limite du nombre de bases de données pouvant être jointes est un paramètre de temps de compilation ( SQLITE_MAX_ATTACHED ), la valeur par défaut est 10, mais cela peut également varier en fonction de la construction 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 mot clé

.databases

Ensuite, vous devriez pouvoir faire ce qui suit.

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

Notez que "les noms de base de données main et temp sont réservés à la base de données primaire et à la base de données pour contenir les tables temporaires et autres objets de données temporaires. Ces deux noms de base de données existent pour chaque connexion à la base de données. et ne doit pas être utilisé pour la fixation ".

113
Brian Gideon

Voici un exemple en C # pour compléter 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;
    }

}
3
Dr.Sai

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 des bases de données telles que 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 initier une instance de sqlite avec plus d'une base de données!

2
Yugal Jindle