当多个 UNION 都进行相同的连接时,有没有办法使它们更有效?

Is there a way to make multiple UNION's more efficient when they all do the same joins?

我有 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 的链接信息,但如果可以的话,我宁愿不重复所有这些连接。有没有一种方法可以 "define" 执行所有这些连接的子查询,然后在其上执行所有联合?

您可以使用union all before加入:

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.*。如果表没有相同的列,则仅列出外部查询所需的列。