【问题标题】:Is there a way to make multiple UNION's more efficient when they all do the same joins?当它们都进行相同的连接时,有没有办法让多个 UNION 更有效率?
【发布时间】:2019-09-06 18:26:46
【问题描述】:

我有 3 个表,我想创建一个视图,从 3 个表中垂直聚合数据(使用 UNIONS)。我已经有一个查询可以执行我想要的操作,但是它为每个查询使用了很多重复的连接,我想知道是否有一种方法可以只连接所有这些表一次并将联合放在上面。

我想加入 3 个表,我将调用它们 desiredTable1desiredTable2desiredTable3

他们都使用joinTablejoinTable2joinTable3 上的连接,如下所示:

(select desiredTable1.id, desiredTable1.created_at, joinTable1.firstname, joinTable1.lastname, 'DESCRIPTOR_1' as "descriptor",  desiredTable1.amount from desiredTable1
join joinTable3 on joinTable3.id = desiredTable1.joinTable3_id
join joinTable2 on joinTable2.id = joinTable3.joinTable2_id
join joinTable1 on joinTable1.id = joinTable2.joinTable1_id)


UNION


(select desiredTable2.id, desiredTable2.created_at, joinTable1.firstname, joinTable1.lastname, 'DESCRIPTOR_2' as "descriptor",  desiredTable2.amount from desiredTable2
join joinTable3 on joinTable3.id = desiredTable2.joinTable3_id
join joinTable2 on joinTable2.id = joinTable3.joinTable2_id
join joinTable1 on joinTable1.id = joinTable2.joinTable1_id)


UNION


(select desiredTable3.id, desiredTable3.created_at, joinTable1.firstname, joinTable1.lastname, 'DESCRIPTOR_3' as "descriptor", desiredTable3.amount from desiredTable3
join joinTable3 on joinTable3.id = desiredTable3.joinTable3_id
join joinTable2 on joinTable2.id = joinTable3.joinTable2_id
join joinTable1 on joinTable1.id = joinTable2.joinTable1_id)

如您所见,我在每个查询中都需要来自joinTable1 的链接信息,但如果我能提供帮助,我不希望重复所有这些连接。有没有办法我可以“定义”一个执行所有这些连接的子查询,然后在此之上执行所有联合?

【问题讨论】:

    标签: sql postgresql join union sql-view


    【解决方案1】:

    您可以在加入之前使用union all

    select dt.id, dt.created_at, jt1.firstname, jt1.lastname, dt.descriptor,  dt.amount
    from ((select dt1.*, 'DESCRIPTOR_1' as descriptor
           from desiredTable1 dt1
          ) union all
          (select dt2.*, 'DESCRIPTOR_2' as descriptor
           from desiredTable2 dt2
          ) union all
          (select dt3.*, 'DESCRIPTOR_3' as descriptor
           from desiredTable3 dt3
          )
         ) dt join
         joinTable3 jt3
         on jt3.id = dt.joinTable3_id join
         joinTable2 jt2
         on jt2.id = jt3.joinTable2_id join
         joinTable1 jt1
         on jt1.id = jt2.joinTable1_id;
    

    注意:为了方便,子查询使用dt.*。如果表没有相同的列,则仅列出外部查询所需的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2020-08-22
      • 2019-09-12
      • 2015-08-13
      • 2011-06-28
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多