SQLite - Як ви з'єднуєте таблиці з різних баз даних?


100

У мене є додаток, який використовує базу даних SQLite, і все працює як слід. Зараз я додаю нові функції, які потребують другої бази даних SQLite, але мені важко з'ясувати, як з'єднати таблиці з різних баз даних.

Якщо хтось може мені допомогти в цьому, я дуже вдячний!

Редагувати: Дивіться це питання на прикладі випадку, який ви можете адаптувати до своєї мови, коли ви додаєте бази даних, як зазначено у прийнятій відповіді.


Що таке база даних? Чи є спільні стовпці, які можна використовувати для їх приєднання? Чи стовпці для кожного однакові, щоб можна було використовувати об'єднання? sqlite.org/syntaxdiagrams.html
Алекс Р.

Так, є стовпці, які можна приєднати за допомогою ключового слова USING, оскільки вони названі однаковими. Моя проблема не в тому, що я не знаю, як приєднатися, оскільки моя програма вже часто робить це на таблицях в одній базі даних, це те, що я не можу знайти, як з'єднати обидві бази даних, щоб дані однієї використовувались від інших ( як приєднання, наприклад)
Адам Сміт

Приклад: перша база даних має таблицю під назвою "розклад", вона містить серед інших стовпців стовпчик дати, ідентифікатор команди та номер смуги. У другій базі даних є таблиця, в якій відслідковуються результати, внесені користувачами за гру їхніх команд. Тож у цій таблиці також є дата та команда ID. Я хочу приєднатися до них за допомогою цих двох стовпців, щоб знати, на якій смузі має грати кожна команда. Є й інші таблиці, які доведеться з'єднати для інших цілей, але ви можете отримати уявлення про те, що мені потрібно з цього прикладу.
Адам Сміт

Відповіді:


126

Якщо 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. Проблема з цим запитом полягає в тому, що я використовую drivermanager для створення свого з'єднання, тому у мене є два об'єкти підключення, які вказують на файли бази даних, але, мабуть, conn1.table чомусь не працює.
Адам Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.