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

问题描述

| 我正在编写一个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.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,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
    

解决方法

您是否不能简单地使用
AS
将所有
tablename.columnname
引用都别名为结果集中的唯一名称?     ,您可以简单地创建一个VIEW,以限制表中可选择的列并为其分配另一个名称。     ,通过在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