SQLite - Farklı veritabanlarından tabloları nasıl birleştirirsiniz?


100

Bir SQLite veritabanı kullanan bir uygulamam var ve her şey olması gerektiği gibi çalışıyor. Şu anda ikinci bir SQLite veritabanı gerektiren yeni işlevler ekleme sürecindeyim, ancak farklı veritabanlarından tabloları nasıl birleştireceğimi bulmakta zorlanıyorum.

Biri bana bu konuda yardımcı olabilirse, gerçekten minnettar olurum!

Düzenle: Kabul edilen yanıtta belirtildiği gibi veritabanlarını eklediğinizde dilinize uyarlayabileceğiniz örnek bir vaka için bu soruya bakın .


Veritabanı nasıldır? Onlara katılmak için kullanılabilecek ortak sütunlar var mı? Bir birleşim kullanabileceğiniz şekilde her birinin sütunları aynı mı? sqlite.org/syntaxdiagrams.html
Alex R.

Evet, aynı isimlendirildikleri için USING anahtar kelimesi kullanılarak birleştirilebilen sütunlar var. Benim sorunum, programım bunu aynı veritabanındaki tablolarda zaten sık sık yaptığı için nasıl katılacağımı bilmiyor olmam değil, her iki veritabanını birbirine nasıl bağlayacağımı bulamıyorum, böylece birinin verileri diğerinden kullanılabilir ( örneğin bir birleşim gibi)
Adam Smith

Örnek: ilk veritabanında "zamanlama" adlı bir tablo vardır, diğer sütunların yanı sıra bir tarih sütunu, bir ekip kimliği ve bir şerit numarası içerir. İkinci veri tabanında, kullanıcıların kendi takım oyunları için girdikleri puanların kaydını tutan bir tablo vardır. Yani bu tablonun bir tarihi ve bir ekip kimliği de var. Her takımın hangi kulvarda oynaması gerektiğini bilmek için bu iki sütunu kullanarak onlara katılmak istiyorum. Başka amaçlar için birleştirilmesi gereken başka masalar da var, ancak bu örnekten neye ihtiyacım olduğuna dair bir fikir edinebilirsiniz.
Adam Smith

Yanıtlar:


127

Eğer ATTACH edilir aktive SQLite ait Yapınızda (içinde olması gerektiği en kullandığınız geçerli bağlantı için başka bir veritabanı dosya ekleyebilirsiniz oluşturur) ATTACH anahtar kelime. Eklenebilir db sayısı sınırı bir derleme zamanı ayarı (olan SQLITE_MAX_ATTACHED ), 10 şu anda varsayılan ama bu çok sahip yapı göre değişebilir. Genel sınır 125'tir.

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

Anahtar kelime ile bağlı tüm veritabanlarını görebilirsiniz

.databases

O zaman aşağıdakileri yapabilmelisiniz.

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

Not "[t] o veritabanı isimleri olduğunu mainve tempgeçici tablolar ve diğer geçici veri nesneleri tutmak için birincil veritabanı ve veritabanı için ayrılmıştır. Bu veritabanı adları Hem her veritabanı bağlantısı için mevcut ve eki için kullanılmamalıdır".


2
StanleyD kullanıcısı ', dosya adının başına (tek tırnak işareti) koyana kadar işine yaramadığını belirtti . Ben de aynısını buldum.
bkribbs

4

İşte bu soruyu tamamlamak için bir C # örneği

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

Şey, SQLite ile ilgili pek tecrübem yok, tek bir sorguda her iki veritabanına da erişmeniz gerekiyor.

Şunun gibi bir şeye sahip olabilirsiniz:

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

SQLServer gibi veritabanlarında bu hiyerarşik tarzda diğer veritabanlarına erişebilirsiniz, bu SQLite için de çalışmalıdır.

1'den fazla veritabanıyla bir sqlite örneğini başlatabileceğinizi düşünüyorum!


Evet, SQL sunucusunun belgelerini gördüm, ancak SQLite için eşdeğer sorguyu bulamadım. Bu sorgudaki sorun, bağlantımı oluşturmak için bir sürücü yöneticisi kullanmam, bu nedenle veritabanı dosyalarına işaret eden iki bağlantı nesnem var, ancak conn1.table'ı yapmak herhangi bir nedenle işe yaramıyor gibi görünüyor.
Adam Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.