web-dev-qa-db-ja.com

Androidアプリケーションで2つのSQLiteテーブルを結合するにはどうすればよいですか?

バックグラウンド

2つのテーブルを持つデータベースを持つAndroidプロジェクトがあります:tbl_questiontbl_alternative

ビューに質問と選択肢を表示するには、カーソルを使用しています。 2つのテーブルを結合するまで、必要なデータを取得しても問題はありません。

 Tbl_question 
 ------------- 
 _id 
 question 
 categoryid 
 Tbl_alternative 
 --------------- 
 _id 
 questionid 
 categoryid 
 alternative 

次のようなものが欲しい:

SELECT tbl_question.question, tbl_alternative.alternative where 
categoryid=tbl_alternative.categoryid AND tbl_question._id = 
tbl_alternative.questionid.` 

これは私の試みです:

public Cursor getAlternative(long categoryid) {
            String[] columns = new String[] { KEY_Q_ID, KEY_IMAGE, KEY_QUESTION, KEY_ALT, KEY_QID};
             String whereClause = KEY_CATEGORYID + "=" + categoryid +" AND "+ KEY_Q_ID +"="+ KEY_QID;
             Cursor cursor = mDb.query(true, DBTABLE_QUESTION + " INNER JOIN "+ DBTABLE_ALTERNATIVE, columns, whereClause, null, null, null, null, null);
             if (cursor != null) {
                  cursor.moveToFirst();
             }
             return cursor;

クエリを形成するこの方法は通常のSQLよりも難しいと思いますが、エラーが発生しにくいため、この方法を使用することをお勧めします。

質問

アプリケーションで2つのSQLiteテーブルを結合するにはどうすればよいですか?

93
kakka47

rawQuery メソッドが必要です。

例:

private final String MY_QUERY = "SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.other_id WHERE b.property_id=?";

db.rawQuery(MY_QUERY, new String[]{String.valueOf(propertyId)});

つかいます ?生のSQLクエリに値を入力する代わりに、バインディング。

198
pawelzieba

別の方法は、テーブルのように照会されるビューを作成することです。多くのデータベースマネージャーでは、ビューを使用するとパフォーマンスが向上します。

CREATE VIEW xyz SELECT q.question, a.alternative  
   FROM tbl_question AS q, tbl_alternative AS a
  WHERE q.categoryid = a.categoryid 
    AND q._id = a.questionid;

これはメモリからのものであるため、構文上の問題がある可能性があります。 http://www.sqlite.org/lang_createview.html

このアプローチに言及したのは、SQLiteQueryBuilderが優先されることを暗示するようにビューで使用できるからです。

20
phreed

間違いなく正しい@pawelziebaの答えに加えて、2つのテーブルを結合しますが、このようにINNER JOINを使用することもできます

SELECT * FROM expense INNER JOIN refuel
ON exp_id = expense_id
WHERE refuel_id = 1

このような生のクエリを介して-

String rawQuery = "SELECT * FROM " + RefuelTable.TABLE_NAME + " INNER JOIN " + ExpenseTable.TABLE_NAME
        + " ON " + RefuelTable.EXP_ID + " = " + ExpenseTable.ID
        + " WHERE " + RefuelTable.ID + " = " +  id;
Cursor c = db.rawQuery(
        rawQuery,
        null
);

クエリの基本的な方法のSQLiteの下位互換性のサポートのため、このコマンドをこれに変換します-

SELECT *
FROM expense, refuel
WHERE exp_id = expense_id AND refuel_id = 1

したがって、SQLiteDatabase.query()ヘルパーメソッドの利点を活用できます。

Cursor c = db.query(
        RefuelTable.TABLE_NAME + " , " + ExpenseTable.TABLE_NAME,
        Utils.concat(RefuelTable.PROJECTION, ExpenseTable.PROJECTION),
        RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " AND " + RefuelTable.ID + " = " +  id,
        null,
        null,
        null,
        null
);

詳細なブログ投稿については、これを確認してください http://blog.championswimmer.in/2015/12/doing-a-table-join-in-Android-without-using-rawquery

12
Arnav Gupta

「あいまいな列」とは、通常、少なくとも2つのテーブルに同じ列名が表示されることを意味します。データベースエンジンは、どちらを使用するかを判断できません。完全なテーブル名またはテーブルエイリアスを使用して、あいまいさを取り除きます。

これが私のエディターにたまたまある例です。それは他の誰かの問題によるものですが、とにかく理にかなっているはずです。

select P.* 
from product_has_image P
inner join highest_priority_images H 
        on (H.id_product = P.id_product and H.priority = p.priority)