从Android中的数据库表中获取记录时禁用某些记录

时间:2014-04-01 07:59:41

标签: java android sqlite cursor

我正在使用Android中的SQLite数据库,并且我很难做出特定的查询:

我有一个带有一些电子邮件ID的表1,我有另一个表2,其中包含电子邮件ID和与这些ID相对应的用户名。从表2中我只需要发送表1中没有的那些emailid / usernames。我想在android中使用Cursor执行此操作,如:

Cursor cursor = getReadableDatabase().query(
                MY_TABLE,
                new String[] {ID},
                EMAIL_ID +" = ?", 
                new String[]{email_id}, 
                null, 
                null, 
                null);

先决条件是:

我不想使用表2中的删除

我不想在表2中创建额外的列。

2 个答案:

答案 0 :(得分:3)

使用NOT IN和子选择来过滤查询中的结果。例如:

SELECT emailid,username FROM table2 WHERE emailid NOT IN (SELECT emailid FROM table1)

使用rawQuery()执行此类原始SQL查询,而不是为您构建SQL的query()

示例:

sqlite> create table table2(emailid,username);
sqlite> create table table1(emailid);
sqlite> insert into table1 select 'a@b.c';
sqlite> insert into table1 select 'a@b.c.d';
sqlite> insert into table2 select 'a@b.c.d','abcd';
sqlite> insert into table2 select 'a@b.c.d.e','abcde';
sqlite> SELECT emailid,username FROM table2 WHERE emailid NOT IN (SELECT emailid FROM table1);
a@b.c.d.e|abcde

由于@ m0skit0坚持他的评论,让我们用相同的数据证明他的查询:

sqlite> SELECT t2.emailid, t2.username FROM table1 t1, table2 t2 WHERE t1.emailid <> t2.emailid;
a@b.c.d|abcd
a@b.c.d.e|abcde
a@b.c.d.e|abcde

答案 1 :(得分:0)

您只需要在emailidusername字段上join两个表格。

SELECT t2.emailid, t2.username FROM table1 t1, table1 t1a, table2 t2 WHERE t1.emailid <> t2.emailid AND t1a.username <> t2.username

这将为table2中的所有行提供emailidusername table1中不存在的行。

如果SQL查询中有多个表,则需要使用rawQuery方法:

private static final String QUERY = "SELECT t2.emailid, t2.username FROM table1 t1, table2 t2 WHERE t1.emailid <> t2.emailid AND t1.username <> t2.usernam";
final Cursor cursor = getReadableDatabase().rawQuery(QUERY, new String[0]);