获取分配有多个联接条件的重复值

时间:2018-09-20 21:15:34

标签: sql presto

我有4个表,下面列出了这些列。我正在使用多个联接条件来引入“活动”表,这导致活动ID重复,并映射到不应该的交易ID。活动ID映射到数据库中的帐户ID,因此存在这一障碍。在下面的期望输出中,deals.id可以为空。

我正在寻找以下输出:

distinct count of activities.id | activities.accountid | deals.id | users.id | users.name

有什么办法可以做到这一点?也许创建索引,数组或新键?这里的任何指导将不胜感激! Here is a sample output of the data with just one rep's data to exhibit the issue。我正在使用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 :(得分:1)

遇到问题时,我通常将查询分解为较小的查询,以尝试找出问题所在。因此,例如,只需从帐户加入活动即可查看重复是否已经发生,或者直到加入交易后才发生。

现在继续整理小样。我的建议是尝试使用Deals表作为起点加入所有账户,因此左加入账户的交易对于每笔交易仅应返回一次该账户,左加入活动应返回许多交易。

换句话说,只需尝试根据以下交易更改您的join子句

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

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

如果这不起作用,我将尝试像这样从起点重写交易查询。请注意,一个好的做法是将来自字段的联接放在on子句的左侧。 (例如,选择a.id = b.id上的左联接b。a.id = c.id上的左联接c,等等。)

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'        

这是一个很大的假设,即无法将交易映射到具有相同所有者和ID的两个活动。在这种情况下,如果活动表中有交易ID,则需要使用交易ID加入活动。

如果这不起作用,我将使用以下子查询来隔离公仔。例子...

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匹配的示例表,并发布一个链接。