PostgreSQL9.3Beta1:LATERAL JOIN

LATERAL JOIN 是 PostgreSQL 9.3 新特性之一,LATERAL 一词意思为 “侧面的,横向的”,LATERAL JOIN 允许 from 语句后面的子查询 subquery2 直接引用 subquery1 的字段,描述比较费力,参照文档,给出例子如下:

例一: LATERAL JOIN

报错 SQL

1
2
3
4
5
6
7
8
9
francs=> SELECT base.nr,
francs-> multiples.multiple
francs-> FROM (SELECT generate_series(1,10) AS nr) base
francs-> JOIN (SELECT generate_series(1,5) AS b_nr, base.nr * 2 AS multiple) multiples
francs-> ON multiples.b_nr = base.nr ;
ERROR: invalid reference to FROM-clause entry for table "base"
LINE 4: JOIN (SELECT generate_series(1,5) AS b_nr, base.nr * 2 AS ...
^
HINT: There is an entry for table "base", but it cannot be referenced from this part of the query.

使用 LATERAL JOIN

1
2
3
4
5
6
7
8
SELECT base.nr,
multiples.multiple
FROM (SELECT generate_series(1,10) AS nr) base,
LATERAL (
SELECT multiples.multiple FROM
( SELECT generate_series(1,5) AS b_nr, base.nr * 2 AS multiple ) multiples
WHERE multiples.b_nr = base.nr
) multiples;

查询结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
francs=> SELECT base.nr,
francs-> multiples.multiple
francs-> FROM (SELECT generate_series(1,10) AS nr) base,
francs-> LATERAL (
francs(> SELECT multiples.multiple FROM
francs(> ( SELECT generate_series(1,5) AS b_nr, base.nr * 2 AS multiple ) multiples
francs(> WHERE multiples.b_nr = base.nr
francs(> ) multiples;
nr | multiple
----+----------
1 | 2
2 | 4
3 | 6
4 | 8
5 | 10
(5 rows)

此外,函数也可直接引用前面子查询的字段,而不需要使用 LATERAL JOIN。

例二: 函数测试

9.3 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
francs=> CREATE FUNCTION multiply(INT, INT)
francs-> RETURNS INT
francs-> LANGUAGE SQL
francs-> AS
francs-> $$
francs$> SELECT $1 * $2;
francs$> $$
francs-> ;
CREATE FUNCTION

francs=> SELECT base.nr,
francs-> multiple
francs-> FROM (SELECT generate_series(1,10) AS nr) base,
francs-> multiply(base.nr, 2) AS multiple;
nr | multiple
----+----------
1 | 2
2 | 4
3 | 6
4 | 8
5 | 10
6 | 12
7 | 14
8 | 16
9 | 18
10 | 20
(10 rows)

9.2 版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[pg92@redhatB ~]$ psql francs francs
psql (9.2.1)
Type "help" for help.

francs=> CREATE FUNCTION multiply(INT, INT)
francs-> RETURNS INT
francs-> LANGUAGE SQL
francs-> AS
francs-> $$
francs$> SELECT $1 * $2;
francs$> $$;
CREATE FUNCTION

francs=> SELECT base.nr,
francs-> multiple
francs-> FROM (SELECT generate_series(1,10) AS nr) base,
francs-> multiply(base.nr, 2) AS multiple;
ERROR: function expression in FROM cannot refer to other relations of same query level
LINE 4: multiply(base.nr, 2) AS multiple;

备注: 9.3 之前版本报错。

参考

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/237975.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论