SQLite - Wie verbinden Sie Tabellen aus verschiedenen Datenbanken?

100

Ich habe eine Anwendung, die eine SQLite-Datenbank verwendet und alles funktioniert so, wie es sollte. Ich bin gerade dabei, neue Funktionen hinzuzufügen, für die eine zweite SQLite-Datenbank erforderlich ist, aber es fällt mir schwer, herauszufinden, wie Tabellen aus den verschiedenen Datenbanken verknüpft werden können.

Wenn mir jemand dabei helfen kann, würde ich es wirklich schätzen!

Bearbeiten: Siehe diese Frage für ein Beispiel Fall , dass Sie auf Ihre Sprache anpassen können , wenn Sie Datenbanken anfügen , wie in der akzeptierten Antwort erwähnt.

Adam Smith
quelle
Wie ist die Datenbank? Gibt es gemeinsame Spalten, mit denen sie verbunden werden können? Sind die Spalten für jede gleich, sodass Sie eine Union verwenden können? sqlite.org/syntaxdiagrams.html
Alex R.
Ja, es gibt Spalten, die mit dem Schlüsselwort USING verbunden werden können, da sie denselben Namen haben. Mein Problem ist nicht, dass ich nicht weiß, wie ich beitreten soll, da mein Programm dies bereits häufig für Tabellen in derselben Datenbank ausführt. Es ist so, dass ich anscheinend nicht finde, wie beide Datenbanken verknüpft werden können, damit die Daten der einen von den anderen verwendet werden können ( wie ein Join zum Beispiel)
Adam Smith
Beispiel: Die erste Datenbank enthält eine Tabelle mit dem Namen "Zeitplan". Sie enthält unter anderem eine Datumsspalte, eine Team-ID und eine Fahrspurnummer. Die zweite Datenbank enthält eine Tabelle, in der die von den Benutzern für ihr Teamspiel eingegebenen Ergebnisse aufgezeichnet werden. Diese Tabelle hat also auch ein Datum und eine Team-ID. Ich möchte mich ihnen mit diesen beiden Spalten anschließen, um zu wissen, auf welcher Spur jedes Team spielen soll. Es gibt andere Tabellen, die für andere Zwecke verbunden werden müssen, aber Sie können anhand dieses Beispiels eine Vorstellung davon bekommen, was ich brauche.
Adam Smith

Antworten:

125

Wenn ATTACH in Ihrem Build von Sqlite aktiviert ist (dies sollte in den meisten Builds der Fall sein ), können Sie mit dem Schlüsselwort ATTACH eine weitere Datenbankdatei an die aktuelle Verbindung anhängen . Die Begrenzung für die Anzahl der DBs, die angehängt werden können, ist eine Einstellung für die Kompilierungszeit ( SQLITE_MAX_ATTACHED ), die derzeit standardmäßig 10 ist. Auch dies kann je nach Build variieren. Das globale Limit liegt bei 125.

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

Sie können alle verbundenen Datenbanken mit dem Schlüsselwort anzeigen

.databases

Dann sollten Sie in der Lage sein, Folgendes zu tun.

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

Beachten Sie, dass "[d] die Datenbanknamen mainund tempfür die Primärdatenbank und die Datenbank reserviert sind, um temporäre Tabellen und andere temporäre Datenobjekte zu speichern. Diese beiden Datenbanknamen existieren für jede Datenbankverbindung und sollten nicht für Anhänge verwendet werden".

Brian Gideon
quelle
2
Benutzer StanleyD bemerkte, dass es für ihn nicht funktionierte, bis er '(einfache Anführungszeichen) um den Dateinamen setzte. Ich habe das gleiche gefunden.
bkribbs
4

Hier ist ein C # -Beispiel, um diese Frage zu beantworten

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

Nun, ich habe nicht viel Erfahrung mit SQLite. Sie müssen in einer einzigen Abfrage auf beide Datenbanken zugreifen.

Sie können so etwas haben wie:

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

In Datenbanken wie SQLServer können Sie auf diese hierarchische Weise auf andere Datenbanken zugreifen. Dies sollte auch für SQLite funktionieren.

Ich denke, Sie können eine Instanz von SQLite mit mehr als 1 Datenbank initiieren!

Yugal Jindle
quelle
Ja, ich habe die Dokumentation für SQL Server gesehen, konnte aber keine entsprechende Abfrage für SQLite finden. Das Problem bei dieser Abfrage ist, dass ich zum Erstellen meiner Verbindung einen Drivermanager verwende. Ich habe also zwei Verbindungsobjekte, die auf die Datenbankdateien verweisen, aber conn1.table zu tun scheint aus irgendeinem Grund nicht zu funktionieren.
Adam Smith