SQL在JOIN查询中选择特定字段

时间:2011-05-24 20:13:13

标签: android sql sqlite

我正在编写一个Android应用程序,但我遇到了一些涉及数据库的障碍。 Android处理数据库的方式,我不能通过通常的'tablename.colname'方法引用结果集中的名称,因此当数据库中的任何表包含相同的列名时,这会出现一个大问题。使问题进一步复杂化的是,ViewAdapter用于向用户显示数据的任何表(如在我的应用程序中)必须包含名为“_id”的字段作为自动增量主键int。因此,一些表必须具有相同的列名。但是,为了避免这种情况,可以在语句中使用“AS”子句来重命名有问题的值。但是,我使用了一个相当长的语句,我不知道如何限制JOINed表上返回的列。我拥有的是这个,由于'tablename.colname'引用,它在android中完全是非法的。我实际上添加了表名以使语句更具可读性,但我无法使用它们:

SELECT call._id AS android_call_id,
call.phone,
call.time,
call.duration
call.duration_billed
call.pending
call.call_id
call.job_id
FROM call

LEFT OUTER JOIN phone ON call.phone_number=phone.phone

LEFT OUTER JOIN job ON job._id=call.job_id

WHERE call.pending=1 ORDER BY job._id

但我需要的是使用“AS”语句将job._id重命名为其他内容,与查询第一部分中的“call._id”字段相同。如何在JOIN中实现此重命名?

编辑:

到目前为止的进展。我想我已经解决了语法错误,但我得到另一个运行时错误“没有这样的列'job._id',这可能与@Tom H.评论

编辑2:

事实证明汤姆是对的,我做了相应的调整,但它不起作用:

SELECT call._id AS android_call_id,
call.phone,
call.time,
call.duration,
call.duration_billed,
call.pending,
call.call_id,
call.job_id,
job._id AS android_job_id,
job.job_name,
job.job_number
FROM call

LEFT OUTER JOIN phone ON call.phone_number=phone.phone

LEFT OUTER JOIN job ON job._id=call.job_id

WHERE call.pending=1 ORDER BY job._id

错误:

05-24 16:50:37.561: ERROR/Minutemaid - Service(7705): oops: ambiguous column name: call._id: , while compiling: SELECT call._id AS android_call_id,call.phone_number,call.time,call.duration,call.duration_billed,call.pending,call.call_id,call.job_id,job._id AS android_job_id,job.job_name,job.job_number FROM call LEFT OUTER JOIN phone ON call.phone_number=phone.phone LEFT OUTER JOIN call ON call.job_id=job._id WHERE call.pending=1 ORDER BY job._id

3 个答案:

答案 0 :(得分:1)

您只需创建一个VIEW即可限制表格中可选择的列,并为其指定另一个名称。

答案 1 :(得分:1)

您不能简单地使用AS来对结果集中唯一名称的所有tablename.columnname引用进行别名吗?

答案 2 :(得分:1)

通过在FROM子句中使用带AS的子查询,可以尝试在加入表名之前对其进行按摩。例如:

select c_phone, c_id, p_id
from (select id as c_id, phone as c_phone, phone_number as c_phone_number, ... from call) as c
left outer join (select id as p_id, phone as p_phone, ... ) as p
  on c_phone_number = p_phone
...

如果限制只是你不能使用表名来区分列但可以使用相关名,那么更简单的是:

select c.id, c.phone, p.id as "p_id" from ... call c join phone p