他のDBファイルにあるデータと結合する場合は、ATTACH DATABASEで取り込んでから結合する。
簡単なdbを二つ作ってみます。
C:\Users\test>sqlite3 data1.db SQLite version 3.10.2 2016-01-20 15:27:19 Enter ".help" for usage hints. sqlite> create table table1 (id, value); sqlite> insert into table1 (id, value) values(1, 'a1'); sqlite> insert into table1 (id, value) values(2, 'a2'); sqlite> insert into table1 (id, value) values(3, 'a3'); sqlite> .quit
C:\Users\test>sqlite3 data2.db SQLite version 3.10.2 2016-01-20 15:27:19 Enter ".help" for usage hints. sqlite> create table table2 (id, value); sqlite> insert into table2 (id, value) values(1, 'b1'); sqlite> insert into table2 (id, value) values(2, 'b2'); sqlite> insert into table2 (id, value) values(3, 'b3'); sqlite> .quit
こんな状態です
data1.db > table1 id value ---------- ---------- 1 a1 2 a2 3 a3 data2.db table2 id value ---------- ---------- 1 b1 2 b2 3 b3
別々のファイルのid列を結合した結果を表示したい。
そんな時は、データベースをATTACHすればよいです。
DBに接続した直後に .databases を実行すると現在接続できているdbが表示されます。
C:\Users\test>sqlite3 data1.db SQLite version 3.10.2 2016-01-20 15:27:19 Enter ".help" for usage hints. sqlite> .databases seq name file --- --------------- ----------------------- 0 main C:\Users\test\data1.db
ATTACH DATABASE [filePath] AS databaseName
ATTACH [filePath] AS databaseName
で、DBの追加ができます
sqlite> ATTACH "C:\Users\test\data2.db" AS db2; sqlite> .databases seq name file --- --------------- ------------------------- 0 main C:\Users\test\data1.db 2 db2 C:\Users\test\data2.db
あとは、db名.table名.column名で指定すればよいだけですね
sqlite> SELECT main.table1.id, main.table1.value, db2.table2.value ...> FROM main.table1 ...> INNER JOIN db2.table2 ...> ON main.table1.id = db2.table2.id; id value value ---------- ---------- ---------- 1 a1 b1 2 a2 b2 3 a3 b3
using System;
using System.Data.SQLite;
using System.Windows.Forms;
namespace SampleCode
{
class Program
{
static void Main(string[] args)
{
try
{
using (SQLiteConnection con = new SQLiteConnection("Data Source=data1.db"))
{
con.Open();
// data2.dbをAttachする
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "ATTACH [data2.db] AS db2;";
cmd.ExecuteNonQuery();
}
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "SELECT main.table1.id, main.table1.value, db2.table2.value " +
"FROM main.table1 " +
"INNER JOIN db2.table2 " +
"ON main.table1.id = db2.table2.id;";
SQLiteDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string data = string.Format("{0}\t{1}\t{2}", reader[0].ToString(), reader[1].ToString(), reader[2].ToString());
Console.WriteLine(data);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}

注意点として、ATTACH する時 ダブルクォートかブラケットで囲まないとエラーになります。
OK "ATTACH \"data2.db\" AS db2;";
OK "ATTACH [data2.db] AS db2;";
NG "ATTACH data2.db AS db2;";
↓
database schema has changed
no such column: data2.db
SQLiteだと、ロックがファイル単位でロックがかかるので
頻繁に更新のあるテーブルは分けて、別ファイルで結合するのがよさそうですね。
ちなみに、DETACHで現在の接続から切り離す事ができます。
DETACH DATABASE [databaseName]
DETACH [databaseName]
0 件のコメント:
コメントを投稿