如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。