псевдоним некоторых имен столбцов как одно поле в запросе выбора соединения оракула - PullRequest
2 голосов
/ 13 мая 2010

Мы разрабатываем что-то вроде сайта социальной сети.У меня есть задача выполнить функцию «следуй за мной».На нашем сайте объектами являются пользователи, команды, компании, каналы и группы (пожалуйста, не спрашивайте, почему существуют группы и команды - мне это тоже сложно, но команды зависят от таланта пользователя)

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

У меня есть запрос, который собирает всех лидеров фолловера, как это

select
  --fo.leader_id,
  --fo.leader_type,
  us.name as user_name,
  co.name as company_name,
  ch.title as channel_name,
  gr.name as group_name,
  tt.name as team_name
from
  follow_up fo
left join users us
  on (fo.leader_id = us.id and fo.leader_type = 'user')
left join companies co
  on (fo.leader_id = co.user_id and fo.leader_type = 'company')
left join channels ch
  on (fo.leader_id = ch.id and fo.leader_type = 'channel')
left join groups gr
  on (fo.leader_id = gr.id and fo.leader_type = 'group')
left join talent_teams tt
  on (fo.leader_id = tt.id and fo.leader_type = 'team')
where
  follower_id = 83

Мне нужно получить все поля, такие как:

  • user_name,
  • company_name,
  • channel_name,
  • group_name,
  • team_name

как одно поле в продукте SELECT.Я попытался присвоить им всем одно и то же имя, но Oracle его пронумеровал.Пожалуйста, помогите:)

Ответы [ 3 ]

3 голосов
/ 13 мая 2010

Я не уверен, почему вам нужно получить их как одно поле, потому что вам не нужно разделять информацию на стороне клиента? В любом случае, вы могли бы сделать это так:

user_name || '|' || company_name || '|' || channel_name || '|' || group_name || '|' || team_name all_fields

Это даст вам поле с разделителями для канала, называемое all_fields. Если у вас есть несколько полей user_name из разных таблиц, вы можете использовать один и тот же подход:

   table1.user_name || '|' || table2.user_name ... all_user_names

Затем можно разделить поле на стороне клиента.

Лично я бы сделал что-то вроде этого:

    table1.user_name table1_user_name
  , table2.user_name table2_user_name
    ...

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

1 голос
/ 14 мая 2010

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

select fo.leader_type, us.name
from follow_up fo
join users us
  on (fo.leader_id = us.id and fo.leader_type = 'user')
where follower_id = 83
UNION ALL
select fo.leader_type, co.name
from follow_up fo
join companies co
  on (fo.leader_id = co.user_id and fo.leader_type = 'company')
where follower_id = 83
UNION ALL
select fo.leader_type, ch.title as name
from follow_up fo
join channels ch
  on (fo.leader_id = ch.id and fo.leader_type = 'channel')
where follower_id = 83
UNION ALL
select fo.leader_type, gr.name
from follow_up fo
join groups gr
  on (fo.leader_id = gr.id and fo.leader_type = 'group')
where follower_id = 83
UNION ALL
select fo.leader_type, tt.name
from follow_up fo
join talent_teams tt
  on (fo.leader_id = tt.id and fo.leader_type = 'team')
where follower_id = 83
0 голосов
/ 14 мая 2010

Я подумал, и я придумаю это решение:

Это медленнее, чем раствор Джеффри Кемпа?

select
  fo.leader_id,
  fo.leader_type,

  case
    when us.subdomain is not null then us.subdomain
    when us2.subdomain is not null then us2.subdomain
    --when co.name is not null then co.name
    when ch.service_url is not null then ch.service_url
    when gr.id is not null then to_char(gr.id)
    when tt.subdomain is not null then tt.subdomain
    else 'nothing!'
    end
    as leader_url,

  case
    when us.name is not null then us.name
    when co.name is not null then co.name
    when ch.title is not null then ch.title
    when gr.name is not null then gr.name
    when tt.name is not null then tt.name
    else 'nothing!'
    end
    as leader_names,

    case
    when us.img_avatar_path is not null then us.img_avatar_path
    when us2.img_avatar_path is not null then us2.img_avatar_path
    --when us.img_avatar_path is not null and fo.leader_id = co.user_id and fo.leader_type = 'company' then us.img_avatar_path
    when ch.default_img is not null then ch.default_img
    when gr.img_avatar_path is not null then gr.img_avatar_path
    when tt.img_avatar_path is not null then tt.img_avatar_path
    else 'nothing!'
    end
    as img_avatar_path,

    case
    when us.img_avatar_x is not null then us.img_avatar_x
    when us2.img_avatar_x is not null then us2.img_avatar_x
    when  ch.default_img_x is not null then ch.default_img_x
    when gr.img_avatar_x is not null then gr.img_avatar_x
    when tt.img_avatar_x is not null then tt.img_avatar_x
    else 0
    end
    as img_avatar_x,

    case
    when us.img_avatar_y is not null then us.img_avatar_y
    when us2.img_avatar_y is not null then us2.img_avatar_y
    when  ch.default_img_y is not null then ch.default_img_y
    when gr.img_avatar_y is not null then gr.img_avatar_y
    when tt.img_avatar_y is not null then tt.img_avatar_y
    else 0
    end
    as img_avatar_y

from
  follow_up fo
  left join users us
  on (fo.leader_id = us.id and fo.leader_type = 'user')
  left join companies co
  on (fo.leader_id = co.user_id and fo.leader_type = 'company')
    left join users us2
    on (co.user_id = us2.id)
  left join channels ch
  on (fo.leader_id = ch.id and fo.leader_type = 'channel')
  left join groups gr
  on (fo.leader_id = gr.id and fo.leader_type = 'group')
  left join talent_teams tt
  on (fo.leader_id = tt.id and fo.leader_type = 'team')
where
  follower_id = :follower_id
...