v2.0
LATERAL关键字
LATERAL 关键字用于在查询中引用先前表达式的结果。它可以与子查询或函数一起使用,并允许在查询中使用先前的表达式结果作为后续表达式的输入。
LATERAL关键字的作用:
- 依赖关联子查询:使用
LATERAL
关键字,可以在查询中引用先前的表达式,从而创建依赖关联的子查询。即可以在子查询中访问先前的表达式的结果,并在查询中使用该结果作为后续表达式的输入。 - 动态列计算:
LATERAL
关键字可以用于动态计算列的值。例如,在查询中使用LATERAL
来计算每行的列值,这些列的计算依赖于先前的表达式结果或其他表中的数据。 - 减少查询次数:通过使用
LATERAL
关键字可以避免多次执行重复的子查询。子查询可以引用外部查询的表达式结果,从而在查询执行过程中减少查询次数,提高性能。
Uqbar=# CREATE TABLE t_product AS
SELECT id AS product_id,
id * 10 * random() AS price,
'product ' || id AS product
FROM generate_series(1, 1000) AS id;
Uqbar=# CREATE TABLE t_wishlist
(
wishlist_id int,
username text,
desired_price numeric
);
Uqbar=# INSERT INTO t_wishlist VALUES
(1, 'hans', '450'),
(2, 'joe', '60'),
(3, 'jane', '1500');
Uqbar=# SELECT *
FROM t_wishlist AS w,
LATERAL (SELECT *
FROM t_product AS p
WHERE p.price < w.desired_price
ORDER BY p.price DESC
LIMIT 3
) AS x
ORDER BY wishlist_id, price DESC;Uqbar-# Uqbar-# Uqbar(# Uqbar(# Uqbar(# Uqbar(# Uqbar(# Uqbar-#
wishlist_id | username | desired_price | product_id | price | product
-------------+----------+---------------+------------+------------------+-------------
1 | hans | 450 | 268 | 447.912638001144 | product 268
1 | hans | 450 | 445 | 440.73279609438 | product 445
1 | hans | 450 | 90 | 436.825405899435 | product 90
2 | joe | 60 | 122 | 57.7194433659315 | product 122
2 | joe | 60 | 50 | 55.5128382984549 | product 50
2 | joe | 60 | 9 | 55.1704007294029 | product 9
3 | jane | 1500 | 168 | 1498.51569615304 | product 168
3 | jane | 1500 | 774 | 1496.66411731392 | product 774
3 | jane | 1500 | 420 | 1494.14442060515 | product 420
(9 rows)