2011-05-24 49 views
0

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

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’,这可能是@汤姆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 
+0

列别名的输出,不是用于连接..你需要在那里使用真正的列名。 – Fosco 2011-05-24 20:15:57

+0

@Fosco我意识到......我不认为你理解这个问题...... – moonlightcheese 2011-05-24 20:18:57

+1

你的SELECT子句中没有任何列出的任务列表。 Android应用程序甚至不应该能够看到它们。我不清楚究竟是什么问题。 – 2011-05-24 20:23:50

回答

1

难道你不能简单地使用AS来将所有的tablename.columnname引用都别名给结果集中的唯一名称吗?

+0

显然如此。只是混淆了语法来得到我所追求的。 – moonlightcheese 2011-05-24 21:57:39

1

你可以简单地创建一个限制列可选择在一个表,并指定另一个南一VIEW e给他们。

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 
+0

aaaahhh ...使子查询的别名更加清晰。感谢这个例子。 – moonlightcheese 2011-05-24 22:00:46