2011-05-24 47 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