Получение повторяющихся значений, назначенных с несколькими условиями соединения - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть 4 таблицы со столбцами, обрисованными в общих чертах ниже.Я использую несколько условий соединения, чтобы вывести таблицу действий, что приводит к дублированию идентификаторов действий и сопоставлению их с идентификаторами сделок, которых не должно быть.Идентификаторы активности сопоставляются с идентификаторами учетных записей в БД, поэтому это препятствие.В желаемом выходе ниже, deals.id может быть нулевым.

Я ищу вывод ниже:

<strong>distinct count of activities.id</strong> | activities.accountid | deals.id | users.id | users.name

Есть ли способ сделать это?Может быть, создать индекс, массив или новый ключ?Любое руководство здесь будет с благодарностью! Вот пример вывода данных с данными только одного представителя, чтобы продемонстрировать проблему .Я использую Presto;ниже мой запрос:

select ac.id activityid, d.id as dealid, u.name, a.id as accountid 
  from accounts a 
  left join activities ac 
    on a.id = ac.accountid 
  join users u 
    on u.id = ac.ownerid 
  left join deals d
    on a.id = d.accountid and d.ownerid = ac.ownerid 
where u.name = 'John'

Счета:

id |

Деятельность:

id | accountid | userid

Сделки:

id | accountid | userid

Пользователи:

id | name

1 Ответ

0 голосов
/ 21 сентября 2018

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

Теперь приступим к сортировке дубликатов.Мое предложение состоит в том, чтобы попытаться объединить все, используя таблицу сделок в качестве отправной точки, поэтому сделки, оставленные присоединенными учетными записями, должны возвращать учетную запись только один раз для каждой сделки, а операции оставленного объединения должны возвращать многие.

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

on a.id = d.accountid and d.ownerid = ac.ownerid 

на

on ac.accountid = d.accountid and d.ownerid = ac.ownerid 

Если это не сработает, я бы попробовал переписатьзапрос от сделок как отправная точка, подобная этой ... Обратите внимание, что хорошей практикой является размещение соединения из полей в левой части предложения on.(например, выберите левое соединение b в a.id = b.id левое соединение c в a.id = c.id и т. д.)

select ac.id activityid, d.id as dealid, u.name, a.id as accountid   
from deals d
left join accounts a
    on d.accountid = a.id 
left join activities ac
    on d.ownerid = ac.ownerid
    and d.accountid = ac.accountid
left join users u
    on d.ownerid = u.id
    and u.name = 'John'        

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

Если это не сработает, я использую следующие подзапросы, чтобы изолировать дупс.Пример ...

select ac.id activityid, d.id as dealid, u.name, a.id as accountid   
from (select * from deals where id in (18,7) d
left join (select * from accounts where id = 21) a
    on d.accountid = a.id 
left join (select * from activities where id = 13) ac
    on d.ownerid = ac.ownerid
    and d.accountid = ac.accountid
left join (select * from users where u.Name = 'John') u
    on d.ownerid = u.id       

Надеюсь, это поможет.Это всегда трудно без воссоздания необработанных таблиц.Попробуйте создать примеры таблиц, которые соответствуют вашей схеме, для db-fiddle и опубликовать ссылку.

...