2017-02-20 2 views
-1

Я столкнулся с проблемой здесь, мне нужно сделать запрос, который, как это следующим образом:Выберите Distinct для нескольких присоединяется

select client.name, client18n.display_name 
     FROM Client client   
     JOIN TEAM team on (client.id = team.client_id) 
     JOIN TEAM_KGK_USER members on (members.team_members_id = team.id) 
     JOIN USER users on (users.id = members.user_id 
     JOIN CLIENT_I18N client18n on (client.id = client18n.client_id) 
     Where users.id = @userId 

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

  • Один клиента может владеть несколькими командами, которые пользователь является членом
  • Еще где положение в том, что Мне нужно получить локаль из Client_I18N, для данного идентификатора языка, который пользователь может передать в этот запрос, но, например, я могу передать fr_FR, но если этого не существует для этого клиента, мне нужно вернуть отображаемое имя для en_US как fall back
  • Мне нужно принять во внимание, что запрос будет иметь макс и выключен
  • Мне нужно заказать по клиентуI18n.display_name

Я использую базу данных Oracle, чтобы проиллюстрировать мои проблемы здесь мы идем:

Представьте пользователя: Джон является членом команды А, команда B, команда C и команда D

поэтому соответствующие клиенты из этих команд являются:

Команда A: Clientâ Команда Б: Clientâ команды C: ClientB команды D: ClientC

для клиенты, они имеют несколько значений в ClientI18N:

Clientâ: ClientA_US Clientâ: ClientA_FR

ClientB: ClientB_US ClientB: ClientB_FR

и пойти на ...

так, если я смотрю на пользователь John

Вернет дважды ClientA для меня, даже если я использую различные, потому что я буду отличаться от client.name и client18n.display_name.

Я попытался вернуться, чем просто имя client.name, поскольку это уникальное значение, но мне нужно заказать By client18n.display_name, потому что если я не сделаю смещение, это не сработает.

это то, что я получаю, когда я выполнить запрос, например:

NAME     DISPLAY_NAME 
    Client_38276QVAAU3 GTA_38276QVAAU3 
    Client_38276QVAAU  GTA_38276QVAAU 
    Client_38276QVAAU  el cliente! 
    Client_38276QVAAU3 der client! 
    Client_38276QVAAU2 le client! 
    Client_38276QVAAU2 GTA_38276QVAAU2 

, как вы можете видеть, даже если я использую отчетливый будет возвращать дублирующиеся имя клиента

+4

Вам нужно будет предоставить запрос, который вы действительно хотите запустить.Примеры данных, желаемые результаты могут помочь объяснить, почему «выбрать отличный» - очевидное решение - не делает то, что вы хотите. –

+0

Кроме того, всегда рекомендуется включать соответствующий тег RDBMS, а также тег конкретной версии, с которым вы работаете. –

+0

Какая СУБД вы используете? Postgres? Oracle? –

ответ

0

Так что в конце концов я нашел это решение, используя соединение

select client.name,client18n.display_name ,client18n.locale_id 
     FROM Client client    
     JOIN TEAM team on (client.id = team.client_id) 
     JOIN TEAM_USER members on (members.team_members_id = team.id) 
     JOIN USER users on (users.id = members.user_id) 
     JOIN CLIENT_I18N client18n on (client.id = client18n.client_id) 
    where client.name not in (Select distinct cli.name 
     from CLIENT cli 
     where client18n.locale_id in ('en_US','fr_FR') group by cli.name having COUNT(*) > 1) and client18n.locale_id in ('en_US','fr_FR') 
    union Select c.name,i18n.display_name ,i18n.locale_id 
      FROM Client c 
      JOIN CLIENT_I18N i18n on (c.id = i18n.client_id) 
      JOIN TEAM t on (c.id = t.client_id) 
      JOIN TEAM_USER tu on (tu.team_members_id = t.id) 
      JOIN USER u on (u.id = tu.user_id) 
    where i18n.locale_id = 'fr_FR' 
0

Попробуйте это:

select client.name, client18n.display_name 
from (select client.name, client18n.display_name 
    FROM Client client   
    JOIN TEAM team on (client.id = team.client_id) 
    JOIN TEAM_KGK_USER members on (members.team_members_id = team.id) 
    JOIN USER users on (users.id = members.user_id 
    JOIN CLIENT_I18N client18n on (client.id = client18n.client_id) 
    Where users.id = @userId 
    order by client18n.display_name) 
    group by client.name