Как объединиться на трех разных столах - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь заполнить свою таблицу названиями компаний, но все они взяты из другой таблицы (в зависимости от типа компании)

Так, например, у меня в текущей таблице есть "visiblebjectid", которыйравно «id» из таблицы «возможность».В этой таблице «возможность» нет названия компании, только «parentaccountid», который ссылается на «Id» в таблице «account», в которой имя известно.

Таким образом, относящийся к объекту из моей текущей таблицысовпадает с идентификатором в другой таблице, из которого мне нужно взять другой столбец, чтобы сопоставить его со столбцом в ДРУГОЙ таблице, чтобы получить имя.

Кто-нибудь знает, как это сделать?Я попробовал несколько левых объединений, но не могу сделать это правильно.

Я использую SQL Server.

Вот фрагмент моего кода из того, что я пробовал:

SELECT
e.regardingobjectid as CompanyId,
case
  when e.regardingobjectid_entitytype = 'account' then a.name
  when e.regardingobjectid_entitytype = 'lead' then l.companyname
  when e.regardingobjectid_entitytype = 'opportunity' then o.name
  when e.regardingobjectid_entitytype = 'incident' then a.name
  when e.regardingobjectid_entitytype = 'contact' then a.name
  when e.regardingobjectid_entitytype = 'salesorder' then a.name
end as Companyname
from emails e

left join opportunity o on e.regardingobjectid = o.id
left join account a on e.regardingobjectid = a.id
left join lead l on e.regardingobjectid = l.id
left join incident i on e.regardingobjectid = i.id
left join contact c on e.regardingobjectid = c.id
left join salesorder s on e.regardingobjectid = s.id

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

В таблицах возможность, учетная запись и ведущая являются имена.Но в таблицах происшествия, контакта и продавца нет имен.В таблице счетов указаны имена компаний-поставщиков, контактных лиц и компаний, помеченных инцидентами.

Например, CompanyId из этого оператора выбора совпадает с 'id' из таблицы инцидентов.В этом инциденте с таблицей есть «accountid», который соответствует «id» в учетной записи таблицы, от которого мне нужно имя.

Мне удалось получить имя для «инцидента», но теперь мойимена для учетной записи исчезли ... Когда я набираю свои объединения следующим образом:

left join crm_systemuser u on p.owneridyominame = u.fullname
left join crm_incident i on i.id = p.regardingobjectid
left join crm_account a on a.id = i.blue10_accountid
left join crm_opportunity o on o.id = p.regardingobjectid
left join crm_account s on s.id = p.regardingobjectid
left join crm_lead l on l.id = p.regardingobjectid

Мои происшествия, потенциальные клиенты и возможности заполняются именами.Однако, когда я меняю порядок:

  left join crm_account a on a.id = e.regardingobjectid
  left join crm_systemuser u on e.owneridyominame = u.fullname
  left join crm_incident i on i.id = e.regardingobjectid
  left join crm_account on a.id = i.blue10_accountid
  left join crm_opportunity o on o.id = e.regardingobjectid
  left join crm_lead l on l.id = e.regardingobjectid

Мои инциденты снова пусты, но мои учетные записи заполнены именами ...

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Просто оставьте присоединиться к цепочке и используйте ISNULL, пока не получите значение для названия компании.

SELECT ISNULL(o.companyname, a.companyname) CompanyName
FROM myCurrentTable t
LEFT JOIN Opportunity o ON t.regardingobjectid=o.id
LEFT JOIN Account a ON o.parentaccountid=a.id

Если вы знаете значения, как в вашем обновленном примере, то вы правильно используете оператор case,Единственная проблема заключается в том, что у вас было несколько опечаток, трижды используя a.name.Попробуйте:

SELECT
e.regardingobjectid as CompanyId,
case
  when e.regardingobjectid_entitytype = 'account' then a.name
  when e.regardingobjectid_entitytype = 'lead' then l.companyname
  when e.regardingobjectid_entitytype = 'opportunity' then o.name
  when e.regardingobjectid_entitytype = 'incident' then ai.name
  when e.regardingobjectid_entitytype = 'contact' then ac.name
  when e.regardingobjectid_entitytype = 'salesorder' then aso.name
end as Companyname
from emails e

left join opportunity o on e.regardingobjectid = o.id
left join account a on e.regardingobjectid = a.id
left join lead l on e.regardingobjectid = l.id
left join incident i on e.regardingobjectid = i.id
left join account ai on i.regardingobjectid = ai.id
left join contact c on e.regardingobjectid = c.id
left join account ac on c.regardingobjectid = ac.id
left join salesorder s on e.regardingobjectid = s.id
left join account aso on s.regardingobjectid = aso.id

Существует другой формат для CASE, который может облегчить чтение, поэтому мой окончательный ответ будет:

SELECT
e.regardingobjectid as CompanyId,
case
  e.regardingobjectid_entitytype when 'account' then a.name
  when 'lead' then l.companyname
  when 'opportunity' then o.name
  when 'incident' then ai.name
  when 'contact' then ac.name
  when 'salesorder' then aso.name
end as Companyname
from emails e

left join opportunity o on e.regardingobjectid = o.id
left join account a on e.regardingobjectid = a.id
left join lead l on e.regardingobjectid = l.id
left join incident i on e.regardingobjectid = i.id
left join account ai on i.regardingobjectid = ai.id
left join contact c on e.regardingobjectid = c.id
left join account ac on c.regardingobjectid = ac.id
left join salesorder s on e.regardingobjectid = s.id
left join account aso on s.regardingobjectid = aso.id
0 голосов
/ 03 апреля 2019

Упрощенный пример, показывающий условия полных соединений

select
  e.regardingobjectid as CompanyId
  ,coalesce(o.name, a.name, l.companyname, i.name, ...) as Companyname
from emails e
left join opportunity o on o.id  = e.regardingobjectid and  e.regardingobjectid_entitytype = 'opportunity'
left join account a on a.id = e.regardingobjectid and e.regardingobjectid_entitytype = 'account'
left join lead l on l.id = e.regardingobjectid and e.regardingobjectid_entitytype = 'lead' 
left join incident i on i.id = e.regardingobjectid and e.regardingobjectid_entitytype = 'incident' 
...
0 голосов
/ 02 апреля 2019

Я полагаю, вы ищете что-то под названием Соединительная таблица , которая позволяет легко объединять несколько таблиц вместе.

Junction Table

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