首页 > 解决方案 > 如果第一次加入没有返回任何值,那么使用另一个

问题描述

我在 postgres 数据库上使用 TypeORM,我需要与一个具有多个“到达那里的方式”的表进行连接,并且我需要从每个表中去,因为旧数据可能以一种方式连接而新数据在另一种方式。

我有表用户,我需要获取表结果,我可以通过以下方式:

                         -> Table A ------------
                       /                         \
User -> (other joins)                              -> Result
                       \                         /
                         -> Table X -> Table Z - 

由于这是一个包含许多其他相关联接的相当长的查询,我认为将整个查询进行两次(一次通过表 A,如果我没有得到结果,一次通过表 X 和 Z)有点效率低下,所以我尝试做的是另一个小子查询只是为了看看我是否可以通过第一条路径(没有所有其他连接)到达结果表,如果可以,那么我将在主查询中添加相同的连接,如果我无法到达第一条路然后我就去第二条路。

// This function receives the main query created with a createQueryBuilder
function getRoute(query) {

  const count = await query.clone()
     .innerJoin('something.tableA', 'tableA')
     .innerJoin('tableA.result', 'result')
     .getCount()

  if (count > 0) {
    query.innerJoin('something.tableA', 'tableA');
    query.innerJoin('tableA.result', 'result')    
  }
  else{
    query.innerJoin('something.tableX', 'tableX');
    query.innerJoin('tableX.tableZ', 'tableZ');
    query.innerJoin('tableZ.result', 'result');
 }
}

然而,这种情况是对我真正问题的简化(因为涉及更多路径和更多“where”子句),有没有办法改进这个解决方案?也许以某种方式缓存第一个 query.clone() 的结果,所以我不必再次进行该过程?

标签: sqlpostgresqltypeorm

解决方案


推荐阅读