SQLite - ¿Cómo se unen tablas de diferentes bases de datos?

100

Tengo una aplicación que usa una base de datos SQLite y todo funciona como debería. Ahora estoy en el proceso de agregar nuevas funcionalidades que requieren una segunda base de datos SQLite, pero estoy teniendo dificultades para descubrir cómo unir tablas de las diferentes bases de datos.

Si alguien me puede ayudar con este, ¡se lo agradecería mucho!

Editar: vea esta pregunta para ver un caso de ejemplo que puede adaptar a su idioma cuando adjunta bases de datos como se menciona en la respuesta aceptada.

Adam Smith
fuente
¿Cómo es la base de datos? ¿Hay columnas comunes que se puedan usar para unirlos? ¿Las columnas para cada uno son iguales de modo que pueda usar una unión? sqlite.org/syntaxdiagrams.html
Alex R.
Sí, hay columnas que se pueden unir con la palabra clave USING, ya que se denominan de la misma manera. Mi problema no es que no sepa cómo unirme, ya que mi programa ya hace esto con frecuencia en las tablas de la misma base de datos, es que parece que no puedo encontrar cómo vincular ambas bases de datos para que los datos de una se puedan utilizar desde la otra ( como una combinación, por ejemplo)
Adam Smith
Ejemplo: la primera base de datos tiene una tabla llamada "horario", contiene, entre otras columnas, una columna de fecha, una identificación de equipo y un número de carril. La segunda base de datos tiene una tabla que mantiene un registro de los puntajes ingresados ​​por los usuarios para el juego de sus equipos. Entonces, esta tabla también tiene una fecha y un teamID. Quiero unirme a ellos usando esas dos columnas para saber en qué carril se supone que debe jugar cada equipo. Hay otras tablas que deberán unirse para otros fines, pero puede hacerse una idea de lo que necesito en este ejemplo.
Adam Smith

Respuestas:

126

Si ATTACH está activado en su compilación de Sqlite (debería estar en la mayoría de las compilaciones), puede adjuntar otro archivo de base de datos a la conexión actual usando la palabra clave ATTACH . El límite en la cantidad de bases de datos que se pueden adjuntar es una configuración de tiempo de compilación ( SQLITE_MAX_ATTACHED ), actualmente el valor predeterminado es 10, pero esto también puede variar según la compilación que tenga. El límite global es 125.

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

Puede ver todas las bases de datos conectadas con palabra clave

.databases

Entonces debería poder hacer lo siguiente.

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

Tenga en cuenta que "[l] os nombres de base de datos mainy tempestán reservados para la base de datos primaria y la base de datos para contener tablas temporales y otros objetos de datos temporales. Ambos nombres de base de datos existen para cada conexión de base de datos y no deben utilizarse para adjuntar".

Brian Gideon
fuente
2
El usuario StanleyD notó que no le funcionó hasta que puso '(comillas simples) alrededor del nombre del archivo. Encontré lo mismo.
bkribbs
4

Aquí hay un ejemplo de C # para completar esta pregunta

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

Bueno, no tengo mucha experiencia con SQLite, tienes que acceder a ambas bases de datos en una sola consulta.

Puedes tener algo como:

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

En bases de datos como SQLServer, puede acceder a otras bases de datos de esta manera jerárquica, esto también debería funcionar para SQLite.

¡Creo que puede iniciar una instancia de sqlite con más de 1 base de datos!

Yugal Jindle
fuente
Sí, vi la documentación para el servidor SQL, pero no pude encontrar la consulta equivalente para SQLite. El problema con esa consulta es que uso un administrador de controladores para crear mi conexión, por lo que tengo dos objetos de conexión que apuntan a los archivos de la base de datos, pero hacer conn1.table no parece funcionar por alguna razón.
Adam Smith