SQLite - Jak łączyć tabele z różnych baz danych?

100

Mam aplikację, która korzysta z bazy danych SQLite i wszystko działa tak, jak powinno. Jestem teraz w trakcie dodawania nowych funkcji, które wymagają drugiej bazy danych SQLite, ale mam trudności ze zrozumieniem, jak połączyć tabele z różnych baz danych.

Jeśli ktoś może mi w tym pomóc, byłbym wdzięczny!

Edytuj: Zobacz to pytanie, aby zobaczyć przykładowy przypadek, który możesz dostosować do swojego języka, dołączając bazy danych, jak wspomniano w zaakceptowanej odpowiedzi.

Adam Smith
źródło
Jaka jest baza danych? Czy są jakieś wspólne kolumny, których można użyć, aby do nich dołączyć? Czy kolumny dla każdego z nich są takie same, że można użyć unii? sqlite.org/syntaxdiagrams.html
Alex R.,
Tak, istnieją kolumny, które można łączyć za pomocą słowa kluczowego USING, ponieważ mają taką samą nazwę. Mój problem nie polega na tym, że nie wiem, jak się przyłączyć, ponieważ mój program już to często robi na tabelach w tej samej bazie danych, po prostu nie mogę znaleźć sposobu połączenia obu baz danych, aby jedne dane były użyteczne z innych ( na przykład złączenie)
Adam Smith
Przykład: pierwsza baza danych ma tabelę o nazwie „harmonogram”, zawiera ona między innymi kolumnę z datą, identyfikator zespołu i numer pasa. Druga baza danych zawiera tabelę, która zawiera zapisy wyników wprowadzonych przez użytkowników w grze zespołowej. Więc ta tabela ma również datę i identyfikator zespołu. Chcę do nich dołączyć, używając tych dwóch kolumn, aby wiedzieć, na której linii powinna grać każda drużyna. Istnieją inne stoły, które trzeba będzie połączyć w innych celach, ale z tego przykładu możesz dowiedzieć się, czego potrzebuję.
Adam Smith

Odpowiedzi:

127

Jeśli ATTACH jest aktywowane w twojej kompilacji Sqlite (powinno być w większości kompilacji), możesz dołączyć inny plik bazy danych do bieżącego połączenia, używając słowa kluczowego ATTACH . Ograniczenie liczby DB, które mogą być przyłączone jest ustawienie czasu kompilacji ( SQLITE_MAX_ATTACHED ), obecnie domyślnie do 10, ale to też może zależeć od kompilacji masz. Globalny limit wynosi 125.

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

Możesz zobaczyć wszystkie podłączone bazy danych za pomocą słowa kluczowego

.databases

Wtedy powinieneś być w stanie wykonać następujące czynności.

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

Należy zauważyć, że „[t] on nazwy baz danych maini tempsą zarezerwowane dla podstawowej bazy danych i bazy danych do przechowywania tabel tymczasowych i innych tymczasowych obiektów danych. Obie te nazwy baz danych istnieją dla każdego połączenia z bazą danych i nie powinny być używane do dołączania”.

Brian Gideon
źródło
2
Użytkownik StanleyD zauważył, że to nie zadziałało, dopóki nie umieścił '(pojedynczych cudzysłowów) wokół nazwy pliku. Znalazłem to samo.
bkribbs
4

Oto przykład C #, aby ukończyć to pytanie

/// <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
źródło
1

Cóż, nie mam dużego doświadczenia z SQLite, musisz uzyskać dostęp do obu baz danych w jednym zapytaniu.

Możesz mieć coś takiego:

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

W bazach danych, takich jak SQLServer, możesz uzyskać dostęp do innych baz danych w ten sposób hierarchiczny, powinno to również działać w przypadku SQLite.

Myślę, że możesz zainicjować wystąpienie sqlite z więcej niż 1 bazą danych!

Yugal Jindle
źródło
Tak, widziałem dokumentację dla serwera SQL, ale nie mogłem znaleźć odpowiedniego zapytania dla SQLite. Problem z tym zapytaniem polega na tym, że używam drivermanagera do tworzenia połączenia, więc mam dwa obiekty połączenia, które wskazują na pliki bazy danych, ale z jakiegoś powodu wykonanie conn1.table nie wydaje się działać.
Adam Smith