SQLite: come si uniscono tabelle da database diversi?


100

Ho un'applicazione che utilizza un database SQLite e tutto funziona come dovrebbe. Sono ora in procinto di aggiungere nuove funzionalità che richiedono un secondo database SQLite, ma ho difficoltà a capire come unire le tabelle dai diversi database.

Se qualcuno mi può aiutare con questo, lo apprezzerei davvero!

Modifica: vedi questa domanda per un caso di esempio che puoi adattare alla tua lingua quando colleghi i database come menzionato nella risposta accettata.


Come sono i database? Esistono colonne comuni che possono essere utilizzate per unirle? Le colonne per ciascuna sono uguali in modo da poter utilizzare un'unione? sqlite.org/syntaxdiagrams.html
Alex R.

Sì, ci sono colonne che possono essere unite usando la parola chiave USING poiché hanno lo stesso nome. Il mio problema non è che non so come unirmi poiché il mio programma lo fa già frequentemente su tabelle nello stesso database, è che non riesco a trovare come collegare entrambi i database in modo che i propri dati siano utilizzabili dall'altro ( come un join, ad esempio)
Adam Smith

Esempio: il primo database ha una tabella chiamata "schedule", contiene, tra le altre colonne, una colonna data, un ID squadra e un numero di corsia. Il secondo database ha una tabella che tiene traccia dei punteggi inseriti dagli utenti per il gioco a squadre. Quindi questa tabella ha anche una data e un teamID. Voglio unirmi a loro usando queste due colonne per sapere su quale corsia dovrebbe giocare ogni squadra. Ci sono altre tabelle che dovranno essere unite per altri scopi, ma puoi avere un'idea di ciò di cui ho bisogno da questo esempio.
Adam Smith

Risposte:


126

Se ATTACH è attivato nella build di Sqlite (dovrebbe essere nella maggior parte delle build), è possibile allegare un altro file di database alla connessione corrente utilizzando la parola chiave ATTACH . Il limite al numero di database che possono essere allegati è un'impostazione del tempo di compilazione ( SQLITE_MAX_ATTACHED ), attualmente il valore predefinito è 10, ma anche questo può variare in base alla build che hai. Il limite globale è 125.

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

Puoi vedere tutti i database collegati con la parola chiave

.databases

Quindi dovresti essere in grado di fare quanto segue.

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

Notare che "[i] nomi di database maine tempsono riservati al database primario e al database per contenere tabelle temporanee e altri oggetti di dati temporanei. Entrambi questi nomi di database esistono per ogni connessione al database e non devono essere utilizzati per l'allegato".


2
L'utente StanleyD ha notato che non ha funzionato per lui fino a quando non ha messo '(virgolette singole) attorno al nome del file. Ho trovato lo stesso.
bkribbs

4

Ecco un esempio in C # per completare questa domanda

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

Bene, non ho molta esperienza con SQLite, devi accedere a entrambi i database in una singola query.

Puoi avere qualcosa come:

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

In database come SQLServer è possibile accedere ad altri database in questo modo gerarchico, questo dovrebbe funzionare anche per SQLite.

Penso che tu possa avviare un'istanza di sqlite con più di 1 database!


Sì, ho visto la documentazione per SQL Server, ma non sono riuscito a trovare la query equivalente per SQLite. Il problema con quella query è che utilizzo un drivermanager per creare la mia connessione, quindi ho due oggetti di connessione che puntano ai file di database, ma eseguire conn1.table non sembra funzionare per qualche motivo.
Adam Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.