注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL9.3Beta1:LATERAL JOIN  

2013-05-30 10:01:10|  分类: Postgres基础 |  标签: |举报 |字号 订阅

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

一 例一:LATERAL JOIN 
--1.1 报错 SQL 
 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.
   

--1.2 使用 LATERAL JOIN
 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.3 查询结果
 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 版本
 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 版
 [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 之前版本报错。                   

三 参考

  评论这张
 
阅读(9600)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016