SQL выбирает определенные поля в запросе JOIN - PullRequest
0 голосов
/ 25 мая 2011

Я пишу приложение для Android и столкнулся с некоторыми препятствиями, связанными с базами данных.То, как Android обрабатывает базы данных, я не могу ссылаться на имена в результирующем наборе обычным методом tablename.colname, так что это представляет огромную проблему, когда любые таблицы в базе данных содержат одно и то же имя столбца.что еще больше усложняет проблему, так это то, что любая таблица, которая используется ViewAdapter для отображения данных пользователю (как в моем приложении), должна содержать поле с именем "_id" в качестве первичного ключа автоинкремента int.поэтому некоторые таблицы ДОЛЖНЫ иметь одинаковые имена столбцов.однако, чтобы избежать этого, можно использовать предложение «AS» в операторе для переименования рассматриваемого значения.Тем не менее, я использую довольно длинный оператор, и я не знаю, как ограничить столбцы, возвращаемые в таблице JOINed.у меня есть это, и это совершенно незаконно в Android из-за ссылок «tablename.colname».я на самом деле добавил имена таблиц, чтобы сделать оператор более читабельным, но я не могу их использовать:

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

, но мне нужно переименовать job._id во что-то другое, используя "AS"msgstr "Оператор", такой же, как с полем "call._id" в первой части запроса.Как мне добиться этого переименования в JOIN?

edit:

прогресс на данный момент.я думаю, что я обработал синтаксические ошибки, но я получаю другую ошибку времени выполнения "нет такого столбца 'job._id', который может быть связан с @Tom H. comment

edit 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 ]

1 голос
/ 25 мая 2011

Разве вы не можете просто использовать AS для псевдонима всех tablename.columnname ссылок на уникальные имена в наборе результатов?

1 голос
/ 25 мая 2011

Вы можете попробовать массировать имена таблиц перед их присоединением, используя подзапросы с AS в предложении FROM. Например:

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
1 голос
/ 25 мая 2011

Вы можете просто создать VIEW, который ограничивает выбор столбцов в таблице и присваивает им другое имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...