Phoenix现在支持在WHERE 和FROM 中使用子查询。子查询可以被指定在很多地方,比如 IN/NOT INEXISTS/NOTEXISTS等。

Subqueries with INor NOT IN

与传统数据库一样,例如:

SELECT ItemName

FROM Items

WHERE ItemID IN

(SELECT ItemID

FROM Orders

WHERE Date >= to_date('2013-09-02'));

返回结果为:

+-------------------+

| ITEMNAME |

+-------------------+

| MU947    |

| MU3508   |

| XT2217    |

+-------------------+

注:我们在之前的博客http://blog.csdn.net/jiangshouzhuang/article/details/52423898中创建Orders表时,Date字段为Char类型,这里需要重新创建表并导入数据,如下:

drop table Orders;

create table IF NOT EXISTS Orders (

OrderID Integer,

CustomerID Char(4),

ItemID Char(4),

Quantity Integer,

Date Date

constraint pk Primary key(OrderID)

);

重新导入数据:

psql.py gpmaster:2181:/hbaseforkylin Orders.sql Orders.csv

Subqueries withEXISTS or NOT EXISTS

我们有可以使用exists实现上面的查询:

SELECT ItemName

FROM Items i

WHERE EXISTS

(SELECT *

FROM Orders

WHERE Date>= to_date('2013-09-02')

AND ItemID = i.ItemID);

结果为:

+-------------------+

| ITEMNAME |

+-------------------+

| MU947    |

| MU3508   |

| XT2217    |

+-------------------+

Semi-joins andAnti-joins

IN/Not IN或EXISTS/NOT EXISTS可以使用Semi-joins和Anti-joins实现。

Semi-join多在子查询exists中使用,对外部数据源的每个键值,查找到内部数据源匹配的第一个键值后就返回,如果找到就不用再查找内部数据源其他的键值了。IN或EXISTS可以转化为Semi-joins。

Anti-join多用于!= not in等查询;如果找到满足条件(!= not in)的不返回,不满足条件(!= not in)的返回,和join相反。NOT IN或NOT EXISTS可以转化为Anti-joins。

Subqueries withComparison Operators

子查询可以使用比较操作符(=, < >, >, > =, <, ! >, !<, or < =)。

比如下面的示例:

SELECT ID, Name

FROM Contest

WHERE Score >

(SELECT avg(Score)

FROM Contest)

ORDER BY Score DESC;

这里子查询只能返回单行,如果返回多行会出现SQL错误提示。

Subqueries withANY/SOME/ALL Comparison Operators

示例:

SELECT OrderID
FROM Orders
WHERE quantity >= ANY
    (SELECT max(quantity)
     FROM Orders
     GROUP BY ItemID);

返回结果:

+----------------+

| ORDERID |

+----------------+

| 1630781 |

| 1630782 |

| 1630783 |

| 1630784 |

| 1630785 |

+----------------+

CorrelatedSubqueries

与传统数据一样,子查询包含的内容与外层查询相关。

SELECT PatentID, Title
FROM Patents p
WHERE FileDate <= ALL
    (SELECT FileDate
     FROM Patents
     WHERE Region = p.Region);

Phoenix会优化上面的查询,通过重写为等式join查询,以便内部查询仅仅需要执行一次,上面的相关性子查询被Phoenix重写为:

SELECT PatentID, Title
FROM Patents p
JOIN
    (SELECT Region col1, collect_distinct(FileDate) col2
     FROM Patent
     GROUP BY Region) t1
ON Region = t1.col1
WHERE FileDate <= ALL(t1.col2);

collect_distinct为Phoenix内部函数,收集一列或表达式所有不同的值到一个Array中。

AND/OR Branches andMultiple levels of Nesting

嵌套子查询,可以在Where,And或Or中使用子查询。

SELECT ItemID, ItemName

FROM Items i

WHERE NOT EXISTS

(SELECT *

FROM Orders

WHERE CustomerID IN

(SELECT CustomerID

FROM Customers

WHERE Country = 'Belgium')

AND Quantity< 1000

AND ItemID = i.ItemID)

OR ItemID != ALL

(SELECT ItemID

FROM Orders

WHERE CustomerID IN

(SELECT CustomerID

FROM Customers

WHERE Country = 'Germany')

AND Quantity < 2000);

Row subqueries

一个子查询可以返回一行的多个字段。

SELECT CUSTOMERID, COUNTRY

FROM Customers2

WHERE (CUSTOMERID, COUNTRY) IN

(SELECT CUSTOMERID, COUNTRY

FROM Customers

WHERE CUSTOMERNAME = 'Logica');

Derived Tables

在From中指定的子查询也被称为“derived table”。

SELECT m, count(*)

FROM

(SELECT max(QUANTITY) m

FROM Orders

GROUP BY ORDERID) AS t

GROUP BY m

ORDER BY count(*) DESC;

Derived table可以在join查询中作为join表指定在任何地方。

 

Apache Phoenix的子查询的更多相关文章

  1. [saiku] 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析

    saiku不仅可以对传统的RDBMS里面的数据做OLAP分析,还可以对Nosql数据库如Hbase做统计分析. 本文简单介绍下一个使用saiku去查询分析hbase数据的例子. 1.phoenix和h ...

  2. Apache Phoenix的Join操作和优化

    估计Phoenix中支持Joins,对很多使用Hbase的朋友来说,还是比较好的.下面我们就来演示一下. 首先看一下几张表的数据: Orders表: OrderID CustomerID ItemID ...

  3. 读书笔记--SQL必知必会11--使用子查询

    11.1 子查询 查询(query),任何SQL语句都是查询.但此术语一般指SELECT语句. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询. 作为子查询的SELECT语句只能 ...

  4. HIVE:用外连接替代子查询

    由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支 ...

  5. Apache Phoenix JDBC 驱动和Spring JDBCTemplate的集成

    介绍:Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排运行以生成标准的JDBC结果集. 直接使用HBase API.协同处理器与自己定义过滤器.对于简单查询来说,其性能 ...

  6. Mapreduce atop Apache Phoenix (ScanPlan 初探)

    利用Mapreduce/hive查询Phoenix数据时如何划分partition? PhoenixInputFormat的源码一看便知: public List<InputSplit> ...

  7. Apache Phoenix的Array类型

    Apache Phoenix支持JDBC ARRAY类型,任何原生的数据类型就可以在ARRAY中使用.下面我介绍一下在创建的表中使用ARRAY类型. 先看一下创建表的SQL语句: CREATE TAB ...

  8. Apache Phoenix基本操作-2

    1. 如何映射一个Phoenix的表到一个Hbase的表? 你可以通过Create table/create view DDL语句在一个已经存在的hbase表上创建一个Phoenix表或者视图.对于C ...

  9. Apache Phoenix系列 | 从入门到精通(转载)

    原文地址:https://cloud.tencent.com/developer/article/1498057 来源: 云栖社区 作者: 瑾谦 By 大数据技术与架构 文章简介:Phoenix是一个 ...

随机推荐

  1. dict字典使用方法

    keys(). values() .items()方法 1.返回格式 dict_keys. dict_values 和 dict_items 2.常用于循环.迭代 for key in dict_te ...

  2. EasyNVR摄像机无插件直播安装使用错误原因解析

    背景需求 EasyNVR(www.easynvr.com)摄像机无插件直播流媒体服务器对于互联网的视频直播还是有着一定的贡献的.为了方便用户的体验使用,我们也在互联网上放置了对应的试用版本,并且也会随 ...

  3. 时间格式化输出strtime

    The format argument consists of one or more codes; as in printf, the formatting codes are preceded b ...

  4. iOS 面试题总结

    最近项目做完了 比较空闲 在网上看了一份面试题 想自己整理一下 一.为什么说Objective-C是一门动态的语言?NSUInteger和NSInteger 的区别? 静态 动态是相对的,这里的动态语 ...

  5. vertical-align:middle;一般用于img和行内文字对齐方式

    vertical-align:top ;文字和行内块元素的顶部对齐 vertical-align:middle;居中 vertical-align:bottom;底对齐

  6. 稀疏自动编码器 (Sparse Autoencoder)

    摘要: 一个新的系列,来自于斯坦福德深度学习在线课程:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial.本文梳理了该教程第一 ...

  7. Node.js的概念与应用

    转:http://blog.jobbole.com/100058/?utm_source=blog.jobbole.com&utm_medium=relatedPosts Node.js 是什 ...

  8. vue框架(一)

    一.介绍 1.Vue是什么? Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关 ...

  9. JavaScript:学习笔记(2)——基本概念与数据类型

    JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...

  10. loadrunder之脚本篇——接口传参为本地文件

    导言 前几天需要对公司一个专门很重要的接口进行压测,这个还不是重点,重点是传参为本地的图片!刚刚开始通过web_custom_request()函数来解决,可是脚本并不能通过!后面又百度不到答案,通过 ...