上記を実現できるようなSQL文をご教示いただける方いらしたらお力添えいただければ幸いです。
SQLとしてはUPDATEで上書き後、INSERTで足りない行を追加する、とのように2段階になるかなと思います。
最初のUPDATEで、idをキーにtableAのname をtableBのnameへセット。
SQL
1UPDATE tableB SET name
2 = (SELECT name FROM tableA WHERE id = tableB.id)
次に、tableAのidの内、tableBのidに無いものを抽出して、INSERT
。
SQL
1INSERT INTO tableB (id, name, num)
SELECT id, name, 0 FROM tableA
2WHERE id NOT IN (SELECT id FROM tableB);
tableAは attach するので、tableBしか無いDB上で作業していてもtableAとしてそのまま使えることになります。attachさえすれば、上記のSQLをそのまま実行できるはずです。
せっかくですので、確認の為に使用したコード例を示します。
Java
1 private void example() {
2 SQLiteDatabase db = null;
3 try {
4 String sql;
5 // mHelper はSQLiteOpenHelperを継承したもの
6 db = mHelper.getWritableDatabase();
7
8 // tableAがあるデータベースファイルをattach
9 String dbaPath = this.getDatabasePath("a.db").getPath();
10 db.execSQL("attach database ? as tableA", new String[]{dbaPath});
11
12 db.beginTransaction();
13 sql = "UPDATE tableB SET name = (SELECT name FROM tableA WHERE id = tableB.id)"
14 ;
15 db.execSQL(sql);
16
17 sql = "INSERT INTO tableB (id, name, num)"
18 + "SELECT id, name, 0 FROM tableA WHERE id NOT IN (SELECT id FROM tableB)"
19 ;
20 db.execSQL(sql);
21 db.setTransactionSuccessful();
22 } catch (Exception ex) {
23 Log.w(TAG, "Exception: " + ex.getMessage());
24 } finally {
25 if (db != null) {
26 db.endTransaction();
27 }
28 }
29 }
上記のコードでtableAとtableBを処理した例を示します。
(sqlite3のコマンドラインツールを使用しています)
# 初期状態のtableA (id, name, num)
sqlite> select * from tableA;
1|hogeA1|11
2|hogeA2|12
3|hogeA3|13
4|hogeA4|14
5|hogeA5|15
# 初期状態のtableB (id, name, num)
sqlite> select * from tableB;
1|hogeB1|5
2|hogeB2|4
3|hogeB3|3
# 処理後 (name はtableAのもので上書き)
sqlite> select * from tableB;
1|hogeA1|5
2|hogeA2|4
3|hogeA3|3
4|hogeA4|0
5|hogeA5|0
余計なアドバイスかとも思いますが、SQLに慣れていない時は、sqlite3のコマンドラインツールやその他のSQLite3対応のツールを使って試し、SQL文自体の検証をすることをおすすめします。それでSQLが完成した後、Android用のプログラムへ落とし込むのが時間もかからず、近道になることが多いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/31 02:07
2017/10/31 02:16