按来自不同表

时间:2018-01-10 09:29:25

标签: sql postgresql

我们目前正在尝试改进一种系统,该系统允许用户按照未显示的字段对大量对象(> 100k)进行过滤和排序。由于可以动态选择字段,我们还计划动态构建查询。

这听起来并不太难,基本功能很容易完成,但问题在于数据的结构。在某些情况下,需要一些或多或少的昂贵的连接,这可能会导致一些非常昂贵的查询,特别是当这些连接被组合时(即select * from table join some_expensive_join join another_expensive_join ...)。

过滤不会是一个大问题,因为我们可以使用交叉点。

但是,排序要求我们首先构建一个包含所有必要数据的表,如果通过一个巨大的select语句完成所有这些连接将变得非常昂贵。

所以问题是:有更有效的方法吗?

我能想到这样做:

  • 对第一列执行select查询并按
  • 排序
  • 对于基本上具有相同顺序(例如相同值)的所有元素,执行另一个查询以解决该问题
  • 重复上述步骤,直到订单明确或我们用完排序标准

这有意义吗?如果是的话,怎样才能在Postgresql 9.4中完成(我们目前无法升级9.5+解决方案,虽然欢迎现在没有帮助)。

1 个答案:

答案 0 :(得分:1)

这有用吗,还是太琐碎了? (子查询可以是预制连接视图)

SELECT t0.id, t0.a,t0.b,t0.c, ...
FROM main_table t0
JOIN ( SELECT t1.id AS id
        , rank() OVER (ORDER BY whatever) AS rnk
        FROM different_tables_or_JOINS
        ) AS t1 ON t1.id=t0.id

JOIN ( SELECT t2.id AS id
        , rank() OVER (ORDER BY whatever) AS rnk
        FROM different_tables_or_JOINS2
        ) AS t2 ON t2.id=t0.id

        ...

ORDER BY t1.rnk
        , t2.rnk
        ...
        , t0.id
        ;