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