我有一个Android项目,其中包含一个包含两个表的数据库:tbl_question
和tbl_alternative
。
使用问题和替代方法填充视图我正在使用游标。在我尝试加入这两个表之前,获取所需的数据没有问题。
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更难形成查询,但是得到了使用这种方式的建议,因为它不容易出错。
如何在我的应用程序中加入两个SQLite表?
答案 0 :(得分:197)
您需要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查询。
答案 1 :(得分:20)
另一种方法是构造一个视图,然后像表一样查询。 在许多使用视图的数据库管理器中,可以带来更好的性能。
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,因为您暗示它是首选。
答案 2 :(得分:10)
除了@ pawelzieba的答案,这肯定是正确的,加入两个表,你可以使用这样的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
答案 3 :(得分:6)
“不明确的列”通常表示相同的列名称出现在至少两个表中;数据库引擎无法分辨出你想要的那个。使用全表名称或表别名来消除歧义。
这是我在编辑器中碰巧遇到的一个例子。这是来自别人的问题,但无论如何都应该有意义。
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)