SQLite - Bagaimana Anda menggabungkan tabel dari database yang berbeda?

100

Saya memiliki aplikasi yang menggunakan database SQLite dan semuanya berjalan sebagaimana mestinya. Saya sekarang dalam proses menambahkan fungsionalitas baru yang membutuhkan database SQLite kedua, tetapi saya mengalami kesulitan mencari cara untuk menggabungkan tabel dari database yang berbeda.

Jika seseorang dapat membantu saya dengan yang satu ini, saya akan sangat menghargainya!

Edit: Lihat pertanyaan ini untuk contoh kasus yang dapat Anda sesuaikan dengan bahasa Anda saat Anda melampirkan database seperti yang disebutkan dalam jawaban yang diterima.

Adam Smith
sumber
Seperti apa basis datanya? Apakah ada kolom umum yang dapat digunakan untuk menggabungkannya? Apakah kolom untuk masing-masing sama sehingga Anda dapat menggunakan gabungan? sqlite.org/syntaxdiagrams.html
Alex R.
Ya, ada kolom yang dapat digabungkan menggunakan kata kunci MENGGUNAKAN karena diberi nama yang sama. Masalah saya bukan karena saya tidak tahu cara bergabung karena program saya sudah sering melakukan ini pada tabel dalam database yang sama, tetapi saya tidak dapat menemukan cara menautkan kedua database sehingga data satu dapat digunakan dari yang lain ( seperti gabungan, misalnya)
Adam Smith
Contoh: database pertama memiliki tabel bernama "schedule", yang berisi antara lain kolom tanggal, ID tim dan nomor jalur. Database kedua memiliki tabel yang melacak skor yang dimasukkan oleh pengguna untuk permainan tim mereka. Jadi tabel ini juga memiliki tanggal dan teamID. Saya ingin bergabung dengan mereka menggunakan dua kolom itu untuk mengetahui jalur mana yang harus dimainkan setiap tim. Ada tabel lain yang harus digabungkan untuk tujuan lain, tetapi Anda bisa mendapatkan gambaran tentang apa yang saya butuhkan dari contoh ini.
Adam Smith

Jawaban:

126

Jika melampirkan yang diaktifkan dalam membangun Anda Sqlite (itu harus di sebagian besar membangun), Anda dapat melampirkan file database lain untuk koneksi saat menggunakan melampirkan kata kunci. The batasan pada jumlah db yang dapat dilampirkan adalah setting waktu kompilasi ( SQLITE_MAX_ATTACHED ), saat ini default ke 10, tetapi ini juga mungkin berbeda dengan membangun yang Anda miliki. Batas globalnya adalah 125.

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

Anda dapat melihat semua database yang terhubung dengan kata kunci

.databases

Maka Anda harus bisa melakukan hal berikut.

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

Perhatikan bahwa "[t] dia nama database maindan tempdicadangkan untuk database utama dan database untuk menampung tabel sementara dan objek data sementara lainnya. Kedua nama database ini ada untuk setiap koneksi database dan tidak boleh digunakan untuk lampiran".

Brian Gideon
sumber
2
Pengguna StanleyD mencatat bahwa itu tidak berfungsi untuknya sampai dia meletakkan '(tanda kutip tunggal) di sekitar nama file. Saya menemukan hal yang sama.
bkribbs
4

Berikut adalah contoh C # untuk menyelesaikan Pertanyaan ini

/// <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
sumber
1

Yah, saya tidak punya banyak pengalaman dengan SQLite, Anda harus mengakses kedua database dalam satu kueri.

Anda bisa mendapatkan sesuatu seperti:

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

Dalam database seperti SQLServer, Anda dapat mengakses database lain dengan cara hierarki ini, ini juga harus berfungsi untuk SQLite.

Saya pikir Anda dapat memulai instance sqlite dengan lebih dari 1 database!

Yugal Jindle
sumber
Ya, saya melihat dokumentasi untuk SQL server, tetapi tidak dapat menemukan kueri yang setara untuk SQLite. Masalah dengan kueri itu adalah saya menggunakan drivermanager untuk membuat koneksi saya, jadi saya memiliki dua objek koneksi yang mengarah ke file database, tetapi melakukan conn1.table tampaknya tidak berfungsi karena beberapa alasan.
Adam Smith