SQLite - как вы объединяете таблицы из разных баз данных?

100

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

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

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

Адам Смит
источник
На что похожа база данных? Есть ли какие-нибудь общие столбцы, которые можно использовать для их соединения? Одинаковы ли столбцы для каждого, так что можно использовать объединение? sqlite.org/syntaxdiagrams.html
Alex R.
Да, есть столбцы, которые можно объединить с помощью ключевого слова USING, поскольку они названы одинаково. Моя проблема не в том, что я не знаю, как присоединиться, поскольку моя программа уже часто делает это для таблиц в одной базе данных, а в том, что я не могу найти, как связать обе базы данных, чтобы одни данные можно было использовать из другой ( как соединение, например)
Адам Смит
Пример: в первой базе данных есть таблица с названием «расписание», она содержит, помимо других столбцов, столбец даты, идентификатор группы и номер полосы движения. Во второй базе данных есть таблица, в которой отслеживаются результаты, введенные пользователями для командных игр. Так что в этой таблице также есть дата и teamID. Я хочу присоединиться к ним, используя эти две колонки, чтобы знать, на какой линии должна играть каждая команда. Есть и другие таблицы, которые нужно будет объединить для других целей, но вы можете понять, что мне нужно, из этого примера.
Adam Smith

Ответы:

127

Если 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;

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

Брайан Гидеон
источник
2
Пользователь StanleyD заметил, что у него это не сработало, пока он не заключил '(в одинарные кавычки) имя файла. Я нашел то же самое.
bkribbs
4

Вот пример 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;
    }

}
Доктор Сай
источник
1

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

У вас может быть что-то вроде:

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

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

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

Югал Джиндл
источник
Да, я видел документацию по SQL-серверу, но не смог найти эквивалентный запрос для SQLite. Проблема с этим запросом заключается в том, что я использую диспетчер драйверов для создания своего соединения, поэтому у меня есть два объекта подключения, которые указывают на файлы базы данных, но выполнение conn1.table, похоже, по какой-то причине не работает.
Adam Smith