SQLite - Как вы объединяете таблицы из разных баз данных? - PullRequest
91 голосов
/ 26 июля 2011

У меня есть приложение, которое использует базу данных SQLite, и все работает так, как должно.Сейчас я нахожусь в процессе добавления новых функций, для которых требуется вторая база данных SQLite, но мне трудно понять, как объединить таблицы из разных баз данных.

Если кто-то может помочь мне свот этот, я бы очень признателен!

Редактировать: См. этот вопрос для примера, который вы можете адаптировать к своему языку, когда присоединяете базы данных, как указанопринятый ответ.

Ответы [ 3 ]

113 голосов
/ 26 июля 2011

Если ATTACH активирован в вашей сборке Sqlite (она должна быть в большинстве сборок), вы можете присоединить другой файл базы данных к текущему соединению, используя ключевое слово ATTACH . Ограничение на количество подключаемых дБ является параметром времени компиляции ( SQLITE_MAX_ATTACHED ), в настоящее время по умолчанию установлено значение 10, но это также может варьироваться в зависимости от имеющейся сборки. Глобальный лимит составляет 125.

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

Вы можете просмотреть все подключенные базы данных с ключевым словом

.
.databases

Тогда вы сможете сделать следующее.

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

Обратите внимание, что «[t] имена баз данных main и temp зарезервированы для первичной базы данных и базы данных для хранения временных таблиц и других временных объектов данных. Оба этих имени базы данных существуют для каждого соединения с базой данных и не должны использоваться для прикрепления ".

3 голосов
/ 31 января 2018

Вот пример C # для завершения этого вопроса

/// <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;
    }

}
2 голосов
/ 26 июля 2011

Ну, у меня нет большого опыта работы с SQLite, вам нужно получить доступ к обеим базам данных одним запросом.

Вы можете иметь что-то вроде:

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

В базах данных, таких как SQLServer, вы можете обращаться к другим базам данных в этом иерархическом порядке, это также должно работать для SQLite.

Я думаю, вы можете запустить экземпляр sqlite с более чем 1 базой данных!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...