参考PostgreSQL专栏中的不同专栏

时间:2017-03-04 09:00:59

标签: postgresql

考虑以下图片

enter image description here

如果您想获得包含所有步骤的结果行以获取未标记边的长度,您可以执行以下操作:

SELECT
5 AS a, --side 1, triangle 1
7 AS b, --side 2, triangle 1
(5*5) AS a2, --a^2
(7*7) AS b2, --b^2
(5*5)+(7*7) AS c2, --a^2 * b^2 = c^2
SQRT((5*5)+(7*7)) AS c, --√c2 = c
19 AS d, --side 1, triangle 2
24 AS e, --side 2 triangle 2
(19*19) AS d2, --d^2
(24*24) AS e2, --e^2
(19*19)+(24*24) AS f2, --d^2 * e^2 = f^2
SQRT((19*19)+(24*24)) AS f, --√f2 = f
(5*5)+(7*7)+(19*19)+(24*24) AS g2, --c^2 * f^2 = g^2
SQRT((5*5)+(7*7)+(19*19)+(24*24)) AS g --√g2 = g

然而,这很明显非常难看。我想使用列替换,例如:

SELECT
5 AS a, --side 1, triangle 1
7 AS b, --side 2, triangle 1
(a*a) AS a2, --a^2
(b*b) AS b2, --b^2
a2+b2 AS c2, --a^2 * b^2 = c^2
SQRT(c2) AS c, --√c2 = c
19 AS d, --side 1, triangle 2
24 AS e, --side 2 triangle 2
(d*d) AS d2, --d^2
(e*e) AS e2, --e^2
d+e AS f2, --d^2 * e^2 = f^2
SQRT(f2) AS f, --√f2 = f
c2+f2 AS g2, --c^2 * f^2 = g^2
SQRT(g2) AS g --√g2 = g

有没有简单的方法可以做到这一点?

PS 请不要解释这是多么荒谬的SQL使用,我知道!这只是我可以减少我的问题被理解的最简单的方法。在我的场景中,使用来自许多连接表的变量进行更复杂的计算,结果需要插入到具有非常严格结构的汇总表中。目前,我将结果带到Node进行计算和插入数据,但这非常非常慢,特别是因为我要通过网络到达数据库服务器。

2 个答案:

答案 0 :(得分:0)

这可以使用常用的表表达式来完成:

with base_vars (a,b,d,e) as (
  values (5),(7),(19),(24)
), var2 (a2, b2, d2, e2) as (
  select a*a, b*b, d*d*, e*e
  from base_vars, 
), var3 (c2, c, f2, f) as (
  select a2+b2, SQRT(a2+b2), d+e, sqrt(d+e)
  from var2, base_vars
), var3 (g2, g) as (
  select c2+f2, sqrt(c2+f2) 
  from var3
)
select sqrt(g)
from var3;

如果我把所有变量都正确的话,我不是100%,但我认为你明白这一点。

另一个选择是将它放入PL / pgSQL函数中。

答案 1 :(得分:0)

lateral比CTE短一点,因为没有必要参考之前的CTE。计划者无法将CTE和主要查询加入到单一计划中。

with t (a,b,d,e) as (values (5,7,19,24))
select c, f, sqrt(c2 + f * f)
from
    t
    cross join lateral
    (select a * a, b * b, d * d, e * e) t1 (a2, b2, d2, e2)
    cross join lateral
    (select a2 + b2, d2 + e2) t2 (c2, f2)
    cross join lateral
    (select sqrt(c2), sqrt(f2)) t3 (c, f)
;
        c         |        f         |       sqrt       
------------------+------------------+------------------
 8.60232526704263 | 30.6104557300279 | 31.7962261911693