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表指定在任何地方。

 

最新文章

  1. Android的NDK技术
  2. Memcached——分布式缓存
  3. C#类和成员的修饰符
  4. Skin++ 皮肤库 CCheckListBox MFC 界面风格
  5. Java基础知识强化59:String(字符串)和其他类型的相互转化
  6. MongoDB Linux下的安装和启动(转)
  7. 解决phpmailer可以在windows下面发送成功, 在linux下面失败的问题
  8. C,C++,VC++有什么区别
  9. 每日java基础知识(01)
  10. 【Spring学习】Spring的源码解析之路 ——【step1】基础环境配置 + IDEA快捷键整理
  11. 象棋start
  12. 20175202 《Java程序设计》第四周学习总结
  13. 使用Ubuntu的Crontab定时任务需要注意的地方
  14. SWIFT中数字格式
  15. Dictionary&lt;string, object&gt;
  16. selenium定位元素的8种方法
  17. border-radius圆角兼容方案
  18. java从字符串中提取数字的简单实例
  19. Node.js:EventEmitter类
  20. Android设计模式系列(2)--SDK源码之观察者模式

热门文章

  1. node.js调用模块
  2. 【BZOJ2045】双亲数 莫比乌斯反演
  3. 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
  4. angular2表单初体验
  5. spring(13)------全面深入解析spring的AOP
  6. Linux中变量测试与内容替换
  7. mysql大致学习路径
  8. 201704 F-02创建财务凭证
  9. 剑指offer 面试49题
  10. Python 函数名作为字典值